Mam stolik

  product(table name)
        product_id
        product_name 
        product_image
        product_price
        product_description
        category_id

  category(table name )
        category_id
        category_name 
        category_description

Mam combobox nazwany jako categoryCombobox i widok siatki nazwany jako productgridview

Próbuję zapełnić siatkę danych w zależności od wyboru w polu kombi... w ten sposób ....

       private viod form_load(object sender, EventArgs e)
       {
        var products = from prods in abc.products
                       select new
                       {
                           prods.product_Id,
                           productname =  prods.product_Name,
                           productimage = prods.product_Image,
                           productprice = prods.product_Price,
                           productdescription = prods.product_Description

                       };
        productbindingsource.DataSource = products;
        productgridview.DataSource = productbindingsource;
        productgridview.Columns[0].Visible = false;
       }
       private void categoryCombobox_SelectedIndexChanged(object sender, EventArgs e)
       {

          // is this query correct 
          var categoryid = from productcategories in abc.categories
                         where productcategories.category_Name.Equals(categoryCombobox.Text)
                         select productcategories.category_Id;

          var produc = from pros in abc.products
                       where pros.Category_Id.Equals(categoryid)
                       select new
                       {
                           productname = pros.product_Name,
                           productimage = pros.product_Image,
                           productprice = pros.product_Price,
                           productdescription = pros.product_Description                                   

                       };
        productbindingsource.DataSource = produc;
        productgridview.DataSource = productbindingsource;
        productgridview.Columns[0].Visible = false;

    }      

Mam taki błąd ......

BŁĄD : W tej linii productbindingsource.DataSource = product;

Nieobsługiwane Wyjątek został cofnięty przez kod użytkownika
Nie można porównać elementów typu „System.Linq.IQueryable`1”. Tylko typy pierwotne (takie jak Int32, String i Guid) oraz encja obsługiwane typy.

-2
Enigma State 17 sierpień 2011, 16:17
Będziemy potrzebować więcej informacji, aby móc pomóc, takich jak skład abc.products.
 – 
user195488
17 sierpień 2011, 16:19
1
Którą część błędu nie rozumiesz? To dość jasno wyjaśnia problem
 – 
Kieren Johnstone
17 sierpień 2011, 16:20
Jeśli rozumiesz, spróbuj rozwiązać ten problem, nadal mam ten sam problem!
 – 
Enigma State
17 sierpień 2011, 16:28
Czy możesz edytować, aby poprawić formatowanie?
 – 
user1228
17 sierpień 2011, 16:29
Powiem jeszcze raz „Której części błędu nie rozumiesz?”. Mówi, że nie możesz porównywać elementów typu IQueryable i że musisz porównać typy pierwotne. Problem polega na tym, że próbujesz porównać IQueryable obiekty...
 – 
Kieren Johnstone
17 sierpień 2011, 17:29

2 odpowiedzi

Najlepsza odpowiedź
var categoryid = from productcategories in abc.categories
                 where productcategories.
                           category_Name.Equals(categoryCombobox.Text)
                 select productcategories.category_Id;

Najedź kursorem na var podczas debugowania. Zobaczysz, że NIE jest to identyfikator, jak się spodziewasz, ale IEnumerable. To, co chcesz zrobić, to

// .First() trips the query and returns a single category_Id
var id = (from productcategories in abc.categories
         where productcategories.
                   category_Name.Equals(categoryCombobox.Text)
         select productcategories.category_Id).First();

var produc = from pros in abc.products
               where pros.Category_Id.Equals(id)
               select new
               {
                   productname = pros.product_Name,
                   productimage = pros.product_Image,
                   productprice = pros.product_Price,
                   productdescription = pros.product_Description                                   
               };

Zwróć uwagę na ids.First(), który pobiera pierwszy wynik z początkowego zapytania.

1
17 sierpień 2011, 19:32
To jest to, co mam problem, gdy używam zapytania BŁĄD: Metoda „First” może być użyta tylko jako ostateczna operacja zapytania. Rozważ użycie metody „FirstOrDefault” w tym przypadku.
 – 
Enigma State
17 sierpień 2011, 17:19
Gdzie pros.Category_Id.Equals(categoryid.FirstOrDefault()) Użyłem tego zapytania, które teraz działa.. wielkie dzięki za wsparcie..
 – 
Enigma State
17 sierpień 2011, 17:21

Twoja próba porównania pola int z zestawem przeliczalnym.

Jeśli zapytanie categoryID zwróci tylko jedną wartość, spróbuj tego:

var produc = from pros in abc.products
                   where pros.Category_Id.Equals(categoryid.Single())
                   select new
                   {
                       productname = pros.product_Name,
                       productimage = pros.product_Image,
                       productprice = pros.product_Price,
                       productdescription = pros.product_Description                                   

                   };

Jeśli ma zwrócić listę identyfikatorów, będziesz chciał napisać pojedyncze zapytanie ze sprzężeniem. Zakładam, że ma być singlem na podstawie imienia categoryId

Edytuj - może nie być w 100% poprawna składnia

var produc = from pros in abc.products
    join cats in abc.categories on cats.category_id equals pros.Category_Id
    where cats.category_Name.Equals(categoryCombobox.Text)
    select new
    {
        productname = pros.product_Name,
        productimage = pros.product_Image,
        productprice = pros.product_Price,
        productdescription = pros.product_Description                                   
    };
0
asawyer 17 sierpień 2011, 16:33
Nie, to zapytanie zwraca IQueryable. Edytowałem za pomocą zapytania linq, które łączy wewnętrznie zamiast dwóch podróży w obie strony bazy danych.
 – 
asawyer
17 sierpień 2011, 16:32