次の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のグループとカウント (およびその他の数)も調べましたが、問題は異なります。
グループキーを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。
ほとんどの場合、EntityFrameworkでは「JOIN」構文は必要ありません。参照: 関連エンティティのロード
説明的で意味のある変数名を書くと、コードが大幅に改善され、理解しやすくなります。読みやすさは、実際の制作では重要です。
あなたのフォーマットを読むのに問題があります。しかし、あなたは試すことができます:
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) }
DefaultIfEmpty
とx => x.RK != null
変更です。