2013-01-23 12 views
8

任意のレコードがある場合、私は、次のLINQツーエンティティはこのスキーマLINQ(によるとカウント)

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

に対して実行され、このメッセージを表示します

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() } 

を照会していますQ:対応するレコードがPにありません: "値の型 'Int32'へのキャストは、マテリアライズされた値がnullであるため失敗しました。結果型の汎用パラメータまたはクエリでnull可能型を使用する必要があります。

問題は最終行のgr.Count()ですが、解決策が見つかりません。私はnullのgrをテストしようとしましたが、動作する方法を見つけることができません。

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

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

また、Group and Count in Entity Framework(と他の多くの番号)を見ましたが、問題は異なります。

答えて

4

フォーマットの読み込みに問題があります。しかし、あなたは試すことができます:DefaultIfEmptyと変更されx => x.RK != null

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) } 

を。

+0

ありがとうございました。残念ながら、これは同じメッセージを返します。 –

13

グループキーは

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 nullにすることはできません。

  1. ほとんどの場合、Entity Frameworkでは「JOIN」構文は必要ありません。 Loading Related Entities

  2. 説明的に意味のある変数名を書くと、コードが大幅に改善され、わかりやすくなります。可読性は現実世界の生産において重要です。

+0

まあ、実際は完璧ではありません。それは正常に実行されますが、PにないRを含むので、間違った答えを与えます。私は結合でそれを修正しようとすると、私は同じメッセージを取得します。 PにないRを除外する別の方法はありますか?その他の提案はありますか? –

+0

解決策を得て正しい結果を返しました。キーは、ソリューションの最初の行にある '.Where(r => r.QK!= null)'です。再度、感謝します。 –