ホームページ >バックエンド開発 >C++ >LINQ Left Join および Group By で子レコードを正確にカウントするにはどうすればよいですか?

LINQ Left Join および Group By で子レコードを正確にカウントするにはどうすればよいですか?

DDD
DDDオリジナル
2025-01-08 20:21:56905ブラウズ

How to Accurately Count Child Records in a LINQ Left Join and Group By?

LINQ – 左結合、グループ化、正確なカウントに関するヒント

複雑な SQL クエリを LINQ to SQL に変換するのは難しい場合があります。典型的な例は、左結合を実行し、列ごとにグループ化し、特定の条件を満たすレコードの数をカウントすることです。

次の 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>

このクエリは、ParentTable と ChildTable の 2 つのテーブルから ParentId と一致する ChildId 数を取得します。

これを LINQ to SQL に変換するには、まず左結合を実行します。

<code class="language-csharp">from p in context.ParentTable
join c in context.ChildTable on p.ParentId equals c.ChildParentId into j1</code>

ただし、COUNT(c.ChildId) の部分は慎重に扱う必要があります。特別な考慮がなければ、LINQ で生成された SQL は常に COUNT(*) を返すため、期待した結果が得られない可能性があります。

一致する ChildId 値のみを正確にカウントするには、into 句の後に次の行を追加します:

<code class="language-csharp">from j2 in j1.DefaultIfEmpty()</code>

これにより、一致する子レコードが見つからない場合、j2 に null 値が割り当てられます。

最後に、グループ化とカウントを実行します:

<code class="language-csharp">group j2 by p.ParentId into grouped
select new { ParentId = grouped.Key, Count = grouped.Count(t => t.ChildId != null) }</code>

このコードは ParentId ごとにグループ化し、ChildId が空ではないレコードのみをカウントします。結果は、元の SQL クエリの形式と一致する、ParentId プロパティと Count プロパティを持つオブジェクトです。 これにより、サブレコードが存在するケースのみがカウントされるようになり、カウント結果の精度に影響を与える左結合によって発生する null 値が回避されます。

以上がLINQ Left Join および Group By で子レコードを正確にカウントするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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