ホームページ >データベース >mysql チュートリアル >複数の結合、カウント、左結合を含む複雑な SQL クエリを LINQ に変換する方法

複数の結合、カウント、左結合を含む複雑な SQL クエリを LINQ に変換する方法

Barbara Streisand
Barbara Streisandオリジナル
2025-01-25 04:43:09729ブラウズ

How to Convert a Complex SQL Query with Multiple Joins, Counts, and Left Joins into LINQ?

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

この例では、複数の結合と集計を含む複雑な SQL クエリを同等の LINQ クエリに変換する方法を示します。このクエリは 3 つのテーブル (TABLE_C、TABLE_V、および TABLE_R) からデータを取得し、特定の列に対して個別のカウント操作を実行します。

SQL から LINQ クエリへの変換の理解:

  1. サブクエリのグループ化: サブクエリを個別に宣言された変数に変換します。この例では、TABLE_R は匿名タイプの Id と Count を使用してグループ化されています。
  2. Join 句: ナビゲーション プロパティまたは匿名オブジェクトを使用して結合し、intoDefaultIfEmpty() を使用して LEFT JOIN をシミュレートします。
  3. GroupBy: 匿名型を使用して、複数の列にわたる結果をグループ化します。 Distinct() を使用して集計結果をカウントします。
  4. 選択: 指定されたフィールドで匿名型を作成して、必要な列を選択します。

次に、クエリ式構文で記述された 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>

次は、ラムダ式構文で書かれた同等の LINQ コードです。

<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(subr2, 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 }) //处理r可能为null的情况
                  .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 
                  }).Distinct();</code>

ラムダ式バージョンの cvr.r.cnt の処理に注意してください。 ?. が null になる可能性がある状況を処理するために、r null 条件演算子が追加され、NullReferenceException 例外が回避されます。 どちらの方法でも同じ機能を実現できますが、どちらの方法を選択するかは個人の好みによって決まります。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。