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()后,我无法完成Case When。我试过了:

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

我该怎么解决这个问题?

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

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();

(更改了范围/λ变量,使其至少有一点意义。(

相关内容

  • 没有找到相关文章