c# - LINQ 计算集合中的多个值

标签 c# linq

在 SQL 中我想要完成的是

SELECT
            SUM(CASE WHEN Kendo=1 THEN 1 ELSE 0 END) as KendoCount,
            SUM(CASE WHEN Icenium=1 THEN 1 ELSE 0 END) as IceniumCount
FROM
            Contacts

我想在 C# 程序中使用 LINQ 执行此操作。

Contacts 是一个列表,其中 Contact 有许多 bool 值,例如 Kendo 和 Icenium,我需要知道每个 bool 值有多少是真的。

最佳答案

至少对于 LINQ to SQL,计数函数的缺点是它需要为每个 .count 方法单独发出 SQL 请求。我怀疑 Jessie 试图对表运行一次扫描,而不是对每个谓词进行多次扫描。根据您创建的逻辑和列数,这可能不会执行得很好。更接近原始请求,尝试将 sum 与三元 if 子句一起使用(来自 Northwind):

from e in Employees
group e by ""  into g
select new { 
    isUs = g.Sum (x =>  x.Country == "USA" ? 1 : 0),
    NotUs = g.Sum (x =>  x.Country != "USA" ? 0 : 1)
}

LINQ to SQL 生成以下内容(YMMV 和其他 ORM):

 SELECT SUM(
    (CASE 
        WHEN [t1].[Country] = @p1 THEN @p2
        ELSE @p3
     END)) AS [isUs], SUM(
    (CASE 
        WHEN [t1].[Country] <> @p4 THEN @p5
        ELSE @p6
     END)) AS [NotUs]
FROM (
    SELECT @p0 AS [value], [t0].[Country]
    FROM [Employees] AS [t0]
    ) AS [t1]
GROUP BY [t1].[value]

关于c# - LINQ 计算集合中的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15487066/

相关文章:

java - DTO和实体的接口(interface)和方法

c# - LinQ查询,只提交/插入了一条记录

c# - Unity(依赖注入(inject)): How to pass in a parameter to the constructor in RegisterType

c# - ASP.Net 核心 2.0 : Creating UrlHelper without request

C# 捕获屏幕到 8 位(256 色)位图

c# - 创建新的 PayPal.Payments.DataObjects.TransactionResponse

C# LINQ "inner join"集合

.net - 最佳开源 LINQ 提供商

c# - 迁移到 dbcontext LINQ where 子句字符串参数

c# - Linq - 序列包含多个元素