LINQ Count() with Case When

问题描述

我有一个 sql Server 查询,我使用 LINQ 在 c# 中重写了这个查询

在 T-sql 查询中,有一个这样的总和:

SELECT Date,Name,SUM(1)*(CASE WHEN Name='Sam' && Date=GETDATE() THEN 0.5 ELSE 1 END) AS 
   ItemCount,SUM(ProductCount) AS ProductCount 
FROM ProductList
GROUP BY Date,Name

我的 Linq

var list = _context.ProductList
   .GroupBy(t => new {t.Date,t.Name})
   .Select(i => new ShipmentList()
   {
      Date = i.Key.Created,Name = i.Key.Name,ItemCount = i.Count(),ProductCount = i.Sum(x => x.ProductCount)
   }).ToList();

在计数 ItemCount= i.Count() 后,我无法完成案例。 我是这样试的:

ItemCount= i.Count()*i. 这次我无法联系到姓名和日期 ItemCount= i.Count()*y=>y.Name bla bla 再次我可以到达任何列。

我该如何解决这个问题?

解决方法

您想要一个有条件的 Count?由于 Linq-To-Entities 不支持谓词的 Enumerable.Count 重载,您可以尝试以下方法:

var list=_context.ProductList
    .GroupBy(t=> new{ t.Date,t.Name})
    .Select(g => new ShipmentList
    { 
        Date = g.Key.Date,Name = g.Key.Name,ItemCount= g.Select(x => x.Name == "Sam" && x.Date == DateTime.Now ? 0.5 : 1.0)
                    .Sum(),ProductCount = g.Sum(x => x.ProductCount)
    })
    .ToList();

顺便说一句,这种情况对我来说没有多大意义。但它与您的 sql 查询中的相同。

,

您应该能够通过为组引用 Key 来直接翻译:

var list = _context.ProductList
   .GroupBy(p => new { p.Date,p.Name })
   .Select(pg => new ShipmentList() {
      Date = pg.Key.Created,Name = pg.Key.Name,ItemCount = pg.Count()*(pg.Key.Name == "Sam" && pg.Key.Date == DateTime.Now ? 0.5 : 1),ProductCount = pg.Sum(p => p.ProductCount)
   }).ToList();

(更改范围/lambda 变量以使其至少有一点意义。)