ホームページ >データベース >mysql チュートリアル >複数の結合、カウント、および左結合をLINQに相当する複雑なSQLクエリを翻訳する方法は?
へのカウントと左の接続 SQLクエリには、複数の接続(左接続を含む)とカウントとカウント(異なる)関数を使用する集約が含まれています。目標は、このクエリをアプリケーションのデータアクセスレイヤーのLINQ等価アイテムに変換することです。
sqlクエリ:SQLクエリをLINQクエリの理解に変換するメソッドは、ネストされた接続と匿名タイプを使用することです。ただし、カウントとカウント(異なる)関数をLINQ構文に変換するのは困難な場合があります。
linq queryの理解: <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 サイトの他の関連記事を参照してください。