2009-04-22 7 views
2

Bei der Ausführung der folgenden LINQ to SQL-Anweisung:Warum erhalte ich eine InvalidOperationException mit dieser Linq to Sql-Methode?

var stuff = from l in _db.SqlLinks 
       select new 
          { 
           Link = l, 
           Rating = (from v in l.SqlLinkVotes 
             where v.Tag == tagId 
               && v.VoteDate >= since 
             select v.Vote).Sum(), 
           NumberOfVotes = (from v in l.SqlLinkVotes 
               where v.Tag == tagId 
                 && v.VoteDate >= since 
               select v.Vote).Count(), 
           NumberOfComments = (from v in l.SqlLinkVotes 
                where v.Tag == tagId 
                 && v.VoteDate >= since 
                 && v.Comment != "" 
                select v.Vote).Count() 
          }; 

ich einen System.InvalidOperationException bekommen (Null-Wert kann nicht auf Int32 zugewiesen werden).

Durch Debugging habe ich gesehen, dass dies von der Eigenschaft Rating des dynamischen Objekts stammt. Wenn es für einen bestimmten Link keine SqlLinkVotes gibt, ergibt Sum() einen Nullwert, aber Rating ist ein Int und linq to sql denkt, dass Sum() zu einem int führt, nicht zu einem nullbaren int.

Ich könnte leicht eine gespeicherte Prozedur schreiben, um dies zu umgehen, aber ich dachte, es war ein guter Weg für mich zu verstehen, linq zu SQL mehr.

Bitte helfen!

Antwort

6

Es gibt eine Connect thread about this, die vorschlägt, dass Sie das Ergebnis von auf einen Nullable-Typ (int? in Ihrem Fall) umwandeln. Ich vermute, dass, wenn Sie die Bewertung als nicht-nullable mögen, können Sie dann den Null-Koaleszenz-Operator verwenden:

Rating = ((int?) (from v in l.SqlLinkVotes 
        where v.Tag == tagId 
        && v.VoteDate >= 
        select v.Vote).Sum()) ?? 0 

Es ist ein Versuch wert, sowieso.

+0

Aha! Du warst schneller als ich! Ich habe gerade das Gleiche gepostet. –

+0

Diese Antwort funktioniert - wurde vor ein paar Wochen gebissen, fand dieses Update. –

+0

Man das ist ein frustrierendes kleines Problem obwohl –

0

Es sieht so aus, als würde man das Rating-Feld einfach als NULL-Zeichen ausgeben, das es repariert hat.

Sieht dies für andere Menschen sinnvoll aus?

var stuff = from l in _db.SqlLinks 
         select new 
            { 
             Link = l, 
             Rating = (int?)(from v in l.SqlLinkVotes 
               where v.Tag == tagId 
                 && v.VoteDate >= since 
               select v.Vote).Sum(), 
             NumberOfVotes = (from v in l.SqlLinkVotes 
                 where v.Tag == tagId 
                   && v.VoteDate >= since 
                 select v.Vote).Count(), 
             NumberOfComments = (from v in l.SqlLinkVotes 
                  where v.Tag == tagId 
                   && v.VoteDate >= since 
                   && v.Comment != "" 
                  select v.Vote).Count() 
            }; 
+0

Ja. Wie meine Antwort suggeriert, könnten Sie den Null-Coalescer-Operator verwenden, um zu einem nicht nullbaren Formular zurückzukehren, das 0 als Standard verwendet, wenn Sie möchten. (Ich * hoffe * das würde sowieso funktionieren ...) –

+0

Es tut, Gott sei Dank! Ich verwandle dieses dynamische Objekt in ein definiertes Objekt, etwas weiter unten in der Methode, damit ich die Nullen dort ersetze. –

Verwandte Themen