ホームページ >データベース >mysql チュートリアル >複数の結合、カウント、左結合を含む複雑な SQL クエリを LINQ に変換する方法
複数の結合、カウント、左結合を含む複雑な SQL クエリを LINQ に変換します
この例では、複数の結合と集計を含む複雑な SQL クエリを同等の LINQ クエリに変換する方法を示します。このクエリは 3 つのテーブル (TABLE_C、TABLE_V、および TABLE_R) からデータを取得し、特定の列に対して個別のカウント操作を実行します。
SQL から LINQ クエリへの変換の理解:
into
と DefaultIfEmpty()
を使用して LEFT JOIN をシミュレートします。 Distinct()
を使用して集計結果をカウントします。 次に、クエリ式構文で記述された 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 サイトの他の関連記事を参照してください。