2013-01-23 15 views
8

Ich habe die folgenden LINQ-to-Entities-AbfrageLINQ to Gruppe Entities durch und Count()

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

, die gegen dieses Schema läuft

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

und gibt diese Meldung, wenn es einen Datensatz in Q mit keinem entsprechenden Datensatz in P: "Die Umwandlung in Werttyp 'Int32' ist fehlgeschlagen, da der materialisierte Wert null ist. Entweder der generische Parameter des Ergebnistyps oder die Abfrage müssen einen Nullwerttyp verwenden."

Das Problem ist die gr.Count() in der letzten Zeile, aber ich kann keine Lösung finden. Ich habe versucht, gr für null zu testen, kann aber keinen Weg finden, der funktioniert.

Ich habe eine Reihe von Lösungen für ein ähnliches Problem mit Sum() statt Count() gesehen, aber ich war nicht in der Lage, sie an mein Problem anzupassen.

Ich habe versucht, meine Abfrage so zu ändern, dass sie wie die in Group and Count in Linq issue aussieht, aber ich habe gerade eine andere Nachricht erhalten.

Ich schaute auch auf Group and Count in Entity Framework (und eine Reihe von anderen), aber das Problem ist anders.

Antwort

4

Ich habe Probleme beim Lesen Ihres Formats. Aber können Sie versuchen:

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

Mit DefaultIfEmpty und x => x.RK != null die Veränderungen zu sein.

+0

Danke für die Beantwortung. Leider gibt dies immer noch die gleiche Nachricht. –

13

Gruppe Key kann nicht null sein

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. Meistens, Sie brauchen keine 'JOIN' Syntax in Entity Framework. siehe: Loading Related Entities

  2. Schreiben beschreibend-sinnvollen Variablennamen würde Ihre Codes erheblich verbessern und verständlich machen. Lesbarkeit spielt in der realen Produktion eine Rolle.

+0

Nun, eigentlich ist es weniger als perfekt. Es läuft gut, aber gibt die falsche Antwort, weil es Rs enthält, die nicht in P sind. Wenn ich versuche, das mit einem Join zu beheben, bekomme ich die gleiche Nachricht. Gibt es eine andere Möglichkeit, Rs auszuschließen, die nicht in P sind? Irgendwelche anderen Vorschläge? –

+0

Ich habe Ihre Lösung zu arbeiten und das richtige Ergebnis zurückgeben. Der Schlüssel ist der ".Where (r => r.QK! = Null)" in der ersten Zeile Ihrer Lösung. Danke noch einmal. –