ホームページ > データベース > mysql チュートリアル > 複数の結合とカウントを含む複雑な SQL クエリを効率的に LINQ に変換するにはどうすればよいですか?

複数の結合とカウントを含む複雑な SQL クエリを効率的に LINQ に変換するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-25 04:44:09
オリジナル
786 人が閲覧しました

How to Efficiently Translate a Complex SQL Query with Multiple Joins and Counts into LINQ?

複数の結合、カウント、左結合を含む SQL を LINQ に変換します

SQL クエリ

次の SQL クエリについて考えてみましょう:

<code class="language-sql">SELECT DISTINCT c.Id, 
       c.Title, 
       COUNT(v.Id) AS 'Nb_V2',
       COUNT(DISTINCT v.IdUser) AS 'Nb_V1',
       r.cnt AS 'Nb_R'
FROM TABLE_C c
JOIN TABLE_V v on c.Id = v.Id
LEFT JOIN ( 
    SELECT Id, COUNT(*)  AS cnt 
    FROM TABLE_R 
    GROUP BY Id
) r ON c.Id = r.Id
WHERE c.IdUser = '1234'
GROUP BY c.Id, c.Title, r.cnt</code>
ログイン後にコピー

LINQ クエリ式

この SQL クエリを LINQ クエリ式に変換するには、次のガイドラインに従ってください:

  1. サブクエリを個別に宣言された変数に変換します。
  2. LINQ 句の順序で各句を変換します。
  3. JOIN 句をナビゲーション プロパティまたは匿名オブジェクトに変換します。
  4. GroupJoinDefaultIfEmpty() を使用して LEFT JOIN をシミュレートします。

これらのルールを適用すると、次の LINQ クエリ式が生成されます:

<code class="language-csharp">var subrq = from r in Table_R
            group r by r.Id into rg
            select new { Id = rg.Key, cnt = rg.Count() };

var ansq = (from c in Table_C
            join v in Table_V on c.Id equals v.Id
            join r in subrq on c.Id equals r.Id into rj
            from r in rj.DefaultIfEmpty()
            where c.IdUser == "1234"
            group new { c, v, r } by new { c.Id, c.Title, r.cnt } into cvrg
            select new {
                cvrg.Key.Title,
                Nb_V2 = cvrg.Count(),
                Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(),
                Nb_R = (int?)cvrg.Key.cnt
            }).Distinct();</code>
ログイン後にコピー

ラムダ式

ラムダ式変換の場合、LEFT JOIN を GroupJoin...SelectMany にさらに変換します:

<code class="language-csharp">var subr2 = Table_R.GroupBy(r => r.Id).Select(rg => new { Id = rg.Key, cnt = rg.Count() });
var ans2 = Table_C.Where(c => c.IdUser == "1234")
                  .Join(Table_V, c => c.Id, v => v.Id, (c, v) => new { c, v })
                  .GroupJoin(subr, cv => cv.c.Id, r => r.Id, (cv, rj) => new { cv.c, cv.v, rj })
                  .SelectMany(cvrj => cvrj.rj.DefaultIfEmpty(), (cvrj, r) => new { cvrj.c, cvrj.v, r })
                  .GroupBy(cvr => new { cvr.c.Id, cvr.c.Title, cvr.r.cnt })
                  .Select(cvrg => new { cvrg.Key.Title, Nb_V2 = cvrg.Count(), Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(), Nb_R = (int?)cvrg.Key.cnt });</code>
ログイン後にコピー

以上が複数の結合とカウントを含む複雑な SQL クエリを効率的に LINQ に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート