web-dev-qa-db-ja.com

LINQ to Entities group byおよびCount()

次の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()を使用して同様の問題に対する解決策をいくつか見てきましたが、それらを自分の問題に適応させることができませんでした。

クエリを Linqのグループとカウントの問題 のように変更しようとしましたが、別のメッセージが表示されました。

Entity Frameworkのグループとカウント (およびその他の数)も調べましたが、問題は異なります。

8
Jim S

グループキーを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. ほとんどの場合、EntityFrameworkでは「JOIN」構文は必要ありません。参照: 関連エンティティのロード

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

17
aifarfa

あなたのフォーマットを読むのに問題があります。しかし、あなたは試すことができます:

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変更です。

4
Joe