2

所有者 (OwnerId!=0) を持っているチームと所有していない (OwnerId==0) チームの数を計算したいと思います。

プレーン SQL では、2 つのサブクエリのみを使用して単一のクエリを使用してそれを行います。

select
    (SELECT COUNT(*) FROM teams WHERE User=0) AS FreeTeams,
    (SELECT COUNT(*) FROM teams WHERE User!=0) AS UsedTeams

もっと簡単な方法はありますか?それをLinq2Sqlに変換する方法は?

ありがとうございました。

4

3 に答える 3

5
var sums =
 (from t in teams
 group t by 0 into g
 select new { freeTeams = g.Count(p => p.User == 0), usedTeams = g.Count(p => p.User != 0) }).SingleOrDefault();

これは単一のクエリのみを発行しますが、L2S はこれを効率的に変換できないため、2 つのテーブル スキャンが必要になります。

これを 1 つのテーブル スキャンにまとめることができます。

var sums =
 (from t in teams
 group t by (t.User != 0) into g
 select new { isUsedTeam = g.Key, Count = g.Count() }).ToList();

これにより、freeTeams 用と usedTeams 用の 2 つの行が得られます。厄介ですが、LINQ2SQL で利用できる最速の方法です。

于 2012-04-20T12:48:52.667 に答える
2

プレーンSQLでは、より簡単な方法は次のCASEステートメントを使用することです。

SELECT SUM(CASE WHEN [User]=0 THEN 1 ELSE 0 END) AS FreeTeams,
       SUM(CASE WHEN [User]<>0 THEN 1 ELSE 0 END) AS UsedTeams
FROM Teams
于 2012-04-20T12:41:21.510 に答える
2

teamsオブジェクトが適切に設定されていると仮定すると、次のように Linq to SQL でこれを行うことができます。

var freeTeams = teams.Count(p => p.User == 0);
var usedTeams = teams.Count(p => p.User != 0);

データベースへの単一のヒットが本当に必要で、読みやすさをいくらか犠牲にしても構わないと思っている場合は、次のようなものを使用できます。

var counts = from a in teams
    group a by true into aa
    select new
    {
        freeTeams = aa.Count(p => p.User == 0),
        usedTeams = aa.Count(p => p.User != 0)
    };
于 2012-04-20T12:38:56.260 に答える