2013-10-30 47 views
1
-------------   
Products | 
-------------  
id   | 
name  | 
price  | 
image  | 
------------- 

------------- 
Sizes  | 
------------- 
id   | 
name  | 
quantity | 
id_product | 
------------- 

在表中Sizes我在每種尺寸的產品中保留不同的尺寸和數量。例如,我在我的產品中有一條牛仔褲,但在表Sizes中,我將它們放在Sizes.Name M和數量20,Sizes.Name XL和數量30等中。LINQ在已連接表中的數據透視表

在我的項目中,當我想要顯示所有的數據IM gridview的有某事林這樣

id  |name  |price | size_name  | quantity | 
----------------------------------------------------------- 
1  jeans  100  M     20 
1  jeans  100  XL     30 
1  jeans  100  S     45 

我想要顯示的是:

id  |name  |price | S | M | XL | 
------------------------------------------------- 
1  jeans  1000 45 20 30 

所以我讀到我必須使用一個關鍵點,但不知道如何開始以及接下來要做什麼。下面是我的一些代碼:

var query = from product in context.Products 
      join size in context.Sizes on product.ID equals r.Product.ID  
      //what's the next step?  
      select new { }; 

dataGridView1.DataSource = query.ToList(); 

===================================

編輯

====================================

現在我已經這樣了

好吧{id, name}不是關鍵, 但有似乎是另一個問題,

var q = (from p in context.Produkty 
        join r in context.Rozmiary 
         on p.ID equals r.Produkt.ID 
         into sizes 
        select new 
        { 
         S = sizes.Where(x => x.Nazwa == NazwaRozmiaru.S).Sum() ?? 0 
        }); 
      dataGridView1.DataSource = q.ToList(); 

給了我這個

Error 2 'System.Collections.Generic.IEnumerable<Magazynier.Model.Rozmiary>' does not contain a definition for 'Sum' and the best extension method overload 'System.Linq.ParallelEnumerable.Sum(System.Linq.ParallelQuery<decimal?>)' has some invalid arguments C:\Users\Piotr\Downloads\Magazynier (7)\Magazynier\Magazynier\Form1.cs 45 34 Magazynier 

Error 3 Instance argument: cannot convert from 'System.Collections.Generic.IEnumerable<Magazynier.Model.Rozmiary>' to 'System.Linq.ParallelQuery<decimal?>' C:\Users\Piotr\Downloads\Magazynier (7)\Magazynier\Magazynier\Form1.cs 45 34 Magazynier 

Error 4 The type arguments for method 'System.Linq.Enumerable.ToList<TSource>(System.Collections.Generic.IEnumerable<TSource>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. C:\Users\Piotr\Downloads\Magazynier (7)\Magazynier\Magazynier\Form1.cs 47 43 Magazynier 

和我的尺寸(又名Rozmiary )看起來像這樣在C#中

public enum NazwaRozmiaru 
{ 
    S, 
    M, 
    L, 
} 

public class Rozmiary : KlasaBazowa 
{ 
    public Produkty Produkt { get; set; } 

    public NazwaRozmiaru Nazwa { get; set; } 

    public int Ilosc { get; set; } 
} 

回答

3

假設:

  • {id, name}是大小
  • 你只想顯示S,M和XL尺寸的關鍵。

試試這個:

from product in context.Products 
join size in context.Sizes 
    on product.ID equals r.Product.ID 
    into sizes 
select new { 
    product.id, 
    product.name, 
    product.price, 
    S = sizes.Where(x => x.name == "S").Select(x => x.quantity).SingleOrDefault(), 
    M = sizes.Where(x => x.name == "M").Select(x => x.quantity).SingleOrDefault(), 
    XL = sizes.Where(x => x.name == "XL").Select(x => x.quantity).SingleOrDefault() 
} 

如果{id, name}不是一個鍵,然後插上電源這樣的:

S = sizes.Where(x => x.name == "S").Sum(x => x.quantity) ?? 0 

如果你想顯示所有的大小,但你不知道是什麼你將無法使用LINQ獲得一個漂亮的桌子,但你可以這樣做:

select new { 
    product.id, 
    product.name, 
    product.price, 
    quantitiesBySize = sizes.ToDictionary(size => size.name, size => size.quantity) 
} 
+0

謝謝你,我會試試這個,讓你知道,如果這樣的作品! – johns

+1

Upvoted的答案。小錯字:x.name ==「S」,即使對於M和XL大小。 –