9

次の LINQ-to-Entities クエリがあります

from r in ctx.Rs
join p in ctx.Ps on r.RK equals p.RK
group r by r.QK into gr
select new { QK = (int)gr.Key, Num = gr.Count() }

このスキーマに対して実行される

Table P  Table R   Table Q
 PK*
 RK ----> RK*
 Text     QK ------> QK*
          Text       Text

Q にレコードがあり、P に対応するレコードがない場合は、次のメッセージが表示されます。 "

問題は最後の行の gr.Count() ですが、解決策が見つかりません。gr の null をテストしようとしましたが、うまくいく方法が見つかりません。

Count() の代わりに Sum() を使用して同様の問題を解決する方法をいくつか見てきましたが、それらを私の問題に適応させることはできませんでした。

クエリをGroup and Count in Linq issueのように変更しようとしましたが、別のメッセージが表示されました。

また、Entity Framework (およびその他多数) のGroup と Countも調べましたが、問題は異なります。

4

2 に答える 2

18

グループ キーを null にすることはできません

var results = ctx.Rs.Where(r => r.QK != null)
    .GroupBy(r => r.QK)
    .Select(gr => new { Key = (int)gr.Key, Count = gr.Count() }
    .ToList();

PS。

  1. ほとんどの場合、Entity Framework では「JOIN」構文は必要ありません。参照:関連エンティティのロード

  2. 説明的で意味のある変数名を書くと、コードが大幅に改善され、理解しやすくなります。読みやすさは、実際の制作では重要です。

于 2013-01-23T04:57:34.517 に答える
5

フォーマットを読み取れません。しかし、あなたは試すことができますか:

from r in ctx.Rs
join p in ctx.Ps.DefaultIfEmpty() on r.RK equals p.RK
group r by r.QK into gr
select new { QK = (int)gr.Key, Num = gr.Count(x => x.RK != null) }

と変化しますDefaultIfEmptyx => x.RK != null

于 2013-01-23T04:53:03.727 に答える