LINQ Count() 与 Case When
Posted
技术标签:
【中文标题】LINQ Count() 与 Case When【英文标题】:LINQ Count() with Case When 【发布时间】:2021-03-11 14:52:41 【问题描述】:我有一个 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
再次,我可以到达任何专栏。
我该如何解决这个问题?
【问题讨论】:
您在GroupBy
中的匿名类型具有Date
和Name
属性,但没有您尝试使用的Created
属性。这不应该编译
不要卡在那里,这只是一个错字,已编辑。我的主要问题是关于 Count()。
无论如何这很重要,因为它向我们表明这只是假代码,无法正常工作。如果可能,请提供编译代码,以便我们知道重点。
SUM(1) * 0.5
如何返回与0.5
不同的内容?我没有收到你的 ItemCount
,它总是 0.5 或 1。
@HimBromBeere 在 SQL 中,SUM
是一个聚合运算符,因此它与组成员的计数基本相同。
【参考方案1】:
你想要一个有条件的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 查询中的相同。
【讨论】:
【参考方案2】:您应该可以通过引用 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();
(更改了 range/lambda 变量以至少有点意义。)
【讨论】:
@HimBromBeere 是的,谢谢,复制粘贴了:(以上是关于LINQ Count() 与 Case When的主要内容,如果未能解决你的问题,请参考以下文章