我有一个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();
(更改了范围/λ变量,使其至少有一点意义。(