连接表中的LINQ数据透视表

时间:2013-10-30 20:08:32

标签: c# linq

-------------           
Products    |
-------------       
id          |
name        |
price       |
image       |
-------------

-------------
Sizes       |
-------------   
id          |
name        |
quantity    |
id_product  |
-------------
Sizes中的

我在每种尺寸的产品中都保留了不同的尺寸和数量。例如,我的产品中有一条牛仔裤,但在表Sizes中,我将它们保存在Sizes.Name M和数量20,Sizes.Name XL和数量30等等。

在我的项目中,我希望显示所有数据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; }
}

1 个答案:

答案 0 :(得分:3)

假设:

  • {id, name}是Sizes的关键
  • 您只想显示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)
}