2

在 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

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

联系人是一个列表,其中联系人有许多布尔值,例如 Kendo 和 Icenium,我需要知道每个布尔值有多少是真的。

4

4 回答 4

5

至少对于 LINQ to SQL,count 函数的缺点是每个 .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 生成以下内容(带有其他 ORM 的 YMMV):

 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]
于 2013-03-18T21:34:11.463 回答
3
var KendoCount = db.Contacts.Where(x => x.Kendo).Count();
var IceniumCount = db.Contacts.Where(x => x.Icenium).Count();
于 2013-03-18T21:17:06.710 回答
3

我会这样做作为两个单独的查询:

int kendoCount = db.Contacts.Count(c => c.Kendo);
int iceniumCount = db.Contacts.Count(c => c.Icenium);

鉴于这些查询将自动转换为优化的 SQL,这可能在速度上与任何查询选项相似甚至可能更快,并且更易于理解。


请注意,如果这是针对实体框架的,则需要将其编写为:

int kendoCount = db.Contacts.Where(c => c.Kendo).Count();
int iceniumCount = db.Contacts.Where(c => c.Icenium).Count();
于 2013-03-18T21:18:01.503 回答
1
var result = Contacts
.GroupBy(c => new
{
    ID = "",
})
.Select(c => new
{
    KendoCount = c.Sum(k => k.Kendo ? 1 : 0),
    IceniumCount = c.Sum(k => k.Icenium ? 1: 0),
})
.ToArray()
于 2013-03-19T04:18:59.603 回答