ホームページ >バックエンド開発 >C++ >複雑な SQL 左結合および集計クエリを LINQ に正確に変換するにはどうすればよいですか?

複雑な SQL 左結合および集計クエリを LINQ に正確に変換するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-08 20:26:51353ブラウズ

How to Accurately Translate a Complex SQL Left Join and Aggregation Query into LINQ?

LINQ: 複雑な結合と集計をマスターする

この記事では、複雑な SQL LEFT JOIN と集計クエリを LINQ に正確に変換する方法を説明します。 この例では、集計に null 値が含まれることを避け、正確なカウントが重要であるシナリオに焦点を当てています。

SQL クエリは次のとおりです:

<code class="language-sql">SELECT p.ParentId, COUNT(c.ChildId)
FROM ParentTable p
  LEFT OUTER JOIN ChildTable c ON p.ParentId = c.ChildParentId
GROUP BY p.ParentId</code>

この SQL クエリは、親 ID を効率的に取得し、それに関連付けられている子 ID をカウントします。 直接 LINQ 変換では、LEFT JOIN、グループ化、集計を正しく処理する必要があります。

最初の、潜在的に欠陥のある LINQ の試行は次のようになります。

<code class="language-csharp">from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1
from j2 in j1.DefaultIfEmpty()
group j2 by p.ParentId into grouped
select new { ParentId = grouped.Key, Count = grouped.Count() }</code>

このコードの問題は、grouped.Count() がグループ内の すべての 要素を、LEFT JOIN の結果生じる null 値も含めてカウントすることです。 これにより、カウントが不正確になります。

解決策は、集計を洗練することです:

<code class="language-csharp">from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1
from j2 in j1.DefaultIfEmpty()
group j2 by p.ParentId into grouped
select new { ParentId = grouped.Key, Count = grouped.Count(t => t.ChildId != null) }</code>

grouped.Count(t => t.ChildId != null) を使用することで、SQL クエリの動作を正確に反映して、null 以外の ChildId 値のみがカウントされるようになります。 この改訂された LINQ クエリは正しい結果を提供し、集計で null をカウントするという落とし穴を回避します。

以上が複雑な SQL 左結合および集計クエリを LINQ に正確に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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