问题描述
我有一个 sql Server 查询,我使用 LINQ 在 c# 中重写了这个查询。
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 变量以使其至少有一点意义。)