如何在Entity Framework中使用条件聚合sql查询?

我正在使用Asp.Net MVC 5和Entity Framework 6.2.0以及LINQ扩展方法语法。

我有5个变种表,详情如下:

产品表:

ProductID Name 12 T-Shirt 

变体表:

 VariantID ProductID Name 1 12 Size 2 12 Color 3 12 Material 

VariantOption表:

 VariantOptionID VariantID VariantOptionName 1 1 Small 2 1 Medium 3 2 Red 4 2 Blue 5 3 Cotton 6 3 Lawn 

Sku表:

 SkuID ProductID SKU Price Barcode 1 12 Th-Sm-Red-Cot 120.00 345423 2 12 Th-Sm-Red-Lon 130.00 345454 3 12 Th-Sm-Blue-Cot 140.00 345451 4 12 Th-Sm-Blue-Lon 150.00 345431 5 12 Th-Md-Red-Cot 160.00 345472 6 12 Th-Md-Red-Lon 170.00 345479 7 12 Th-Md-Blue-Cot 180.00 654353 8 12 Th-Md-Blue-Lon 190.00 254353 

VariantOptionCombination表:

 VariantOptionID SkuID 1 1 3 1 5 1 1 2 3 2 6 2 1 3 4 3 5 3 1 4 4 4 6 4 

我想在网页上显示这些表记录为。

 Size Color Material Price Sku Small Red Cotton 120.00 345423 Small Red Lawn 130.00 345454 Small Blue Cotton 140.00 345451 Small Blue Lawn 150.00 345431 Medium Red Cotton 160.00 345472 Medium Red Lawn 170.00 345479 Medium Blue Cotton 180.00 654353 Medium Blue Lawn 190.00 254353 

我正在使用此查询来实现所需的输出。 如何在Entity Framework linq中翻译此查询?

 select max(case when v.Name = 'Size' then vo.Name end) as Size, max(case when v.Name = 'Color' then vo.Name end) as Color, max(case when v.Name = 'Material' then vo.Name end) as Material, s.price from ProductSKU s join ProductVariantOptionCombination voc on s.SkuID = voc.SkuId join ProductVariantOption vo on vo.VariantOptionId = voc.VariantOptionId join ProductVariant v on v.VariantId = vo.VariantId group by s.Price; 

试试这样;

  var query = from s in YourDbContext.DbSet join voc in YourDbContext.DbSet on s.SkuID equals voc.SkuID join vo in YourDbContext.DbSet on voc.VariantOptionID equals vo.VariantOptionID join v in YourDbContext.DbSet on vo.VariantID equals v.VariantID group new {s,voc, vo, v} by s.Price into g select new { Price = g.Key, Size = g.Max(x => xvName == "Size" ? x.vo.VariantOptionName : ""), Color = g.Max(x => xvName == "Color" ? x.vo.VariantOptionName : ""), Material = g.Max(x => xvName == "Material" ? x.vo.VariantOptionName : "") };