ホームページ >データベース >mysql チュートリアル >複数の結合、カウント、および左結合をLINQに相当する複雑なSQLクエリを翻訳する方法は?

複数の結合、カウント、および左結合をLINQに相当する複雑なSQLクエリを翻訳する方法は?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-25 04:21:08725ブラウズ

How to translate a complex SQL query with multiple joins, COUNT, and a left join into its LINQ equivalent?

複数の接続を含むSQLを変換し、linq

へのカウントと左の接続 SQLクエリには、複数の接続(左接続を含む)とカウントとカウント(異なる)関数を使用する集約が含まれています。目標は、このクエリをアプリケーションのデータアクセスレイヤーのLINQ等価アイテムに変換することです。

sqlクエリ:

linq queryの理解:

SQLクエリをLINQクエリの理解に変換するメソッドは、ネストされた接続と匿名タイプを使用することです。ただし、カウントとカウント(異なる)関数をLINQ構文に変換するのは困難な場合があります。
<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>

ラムダ表現:

lambda式を使用して、Linq変換のためのより簡潔なソリューションを実装できます。 Join ... Selectmanyを使用して操作してグループ化することで、クエリを次のように記述できます。

翻訳ガイド:

子供が外部列を引用することを選択しない限り、独立して変換する必要があります。

単一の単一演算子と重合演算子をLINQクエリの結果に直接適用できます。
<code class="language-csharp">var ans2 = Table_C.Where(c => c.IdUser == "1234")
                  .Join(Table_V, c => c.Id, v => v.Id, (c, v) => new { c, v })
                  .GroupJoin(Table_R.GroupBy(r => r.Id).Select(rg => new { Id = rg.Key, cnt = rg.Count() }), 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可能为空的情况
                  .Select(cvrg => new { 
                      cvrg.Key.Title, 
                      Nb_V2 = cvrg.Count(), 
                      Nb_V1 = cvrg.Select(cvr => cvr.v.IdUser).Distinct().Count(), 
                      Nb_R = cvrg.Key.cnt 
                  });</code>

匿名タイプは、複数の列を表すために使用されます。 接続クラスは、ナビゲーション属性または匿名オブジェクトで表されます。

左接続は、GroupJoin ... SelectManyで使用する必要があります。

が空になり、対応する空室チェックが
    および
  • に追加される状況に注意してください。
  • この復活した答えは、
  • および
  • 条項の潜在的なnull値を処理することにより、Linqクエリを改善します。 sqlからlinqへのガイド

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

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