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 は、述語ごとに複数のスキャンを実行するのではなく、テーブルに対して 1 回のスキャンを実行しようとしていると思われます。作成しているロジックと列の数によっては、これがうまく機能しない場合があります。元の要求に近づけて、(Northwind からの) 三項の if 句で sum を使用してみてください。

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

これを 2 つの別個のクエリとして実行します。

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

これらのクエリが自動的に最適化された SQL に変換されることを考えると、これはおそらくどのクエリ オプションよりも速度が似ているか、場合によっては高速になり、はるかに理解しやすくなります。


これが Entity Framework 用の場合は、次のように記述する必要があることに注意してください。

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 に答える