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 中的匿名类型具有DateName 属性,但没有您尝试使用的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的主要内容,如果未能解决你的问题,请参考以下文章

Laravel ORM怎么用where case end?

linq 加入 case 条件

避免 switch case -linq [重复]

Linq高级查询与分页查询

具有 CASE 和子查询的 sql to LINQ

C# 将带有 Case 语句的 SQL 查询转换为 LINQ