2013-03-28 2 views
5

Ich versuche, die folgende in LINQNull-Fehler erhalten LINQ; Kann das dann nicht nutzen?

double totalDistance = (from g in db.Logs join 
    h in db.Races on g.raceId equals h.RaceId 
    where g.userId == id select h.distance).Sum(); 

jedoch erhalten einen Fehler auszuführen:

The cast to value type 'Double' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

Ich habe versucht, hinzuzufügen, auf ?? 0; so dass:

double totalDistance = (from g in db.Logs join 
    h in db.Races on g.raceId equals h.RaceId 
    where g.userId == id select h.distance).Sum() ?? 0; 

Wie in anderen Beiträgen vorgeschlagen jedoch ergibt dies einen Fehler:

operator '??' cannot be applied to operands double or int

Irgendwelche Vorschläge?

EDIT: mein Modell

namespace RacePace.Models 
{ 
public class Race 
{ 
    public int RaceId { get; set; } 

    [DisplayName("Race Setting")] 
    public string place { get; set; } 
    [DisplayName("Distance (km)")] 
    public double distance { get; set; } 
    [DisplayName("Date")] 
    public DateTime date { get; set; } 
    [DisplayName("Commencement Time")] 
    public DateTime timeStarted { get; set; } 
    [DisplayName("Active")] 
    public Boolean active { get; set; } 
    [DisplayName("Description")] 
    public string description { get; set; } 
    [DisplayName("Creator")] 
    public int UserId { get; set; } 
} 
} 
+2

Ist "Abstand" nullfähig? – mattytommo

+0

Same leider, Nachricht wird dann 'Opperator' ?? kann nicht auf "double" oder "floats" angewendet werden – NickP

+0

Können Sie Ihr Modell zeigen? – Alex

Antwort

2

Sie sollten Abstand NULL-Double in Ihrem Modell zu machen machen ?? Arbeit. Von http://msdn.microsoft.com/en-us/library/ms173224.aspx:

Die ?? Betreiber ist der Null-Koaleszenz-Operator aufgerufen und verwendet wird, einen Standardwert für Nullable-Wertetypen oder Referenztyp

So Ihr Modell machen

public double? distance { get; set; } 

sollte

Wechsel zu definieren ?? Arbeit

+0

Das könnte (möglicherweise sehr negative) Auswirkungen auf alles andere haben, das das Modell verwendet. – Stainy

1

warf sie alle zu verdoppeln.

double totalDistance = (double)((from g in db.Logs join h in db.Races on g.raceId equals h.RaceId where g.userId == id select h.distance).Sum() ?? 0); 

Edit: versuchen, die double.Parse

var someObject = (from g in db.Logs join h in db.Races on g.raceId equals h.RaceId where g.userId == id select h.distance); 
double totalDistance = (someObject !=null)? someObject.Sum() : 0; 
+0

Gleiches Problem: 'Opterator' ?? ' kann nicht auf "double" oder "floats" angewendet werden – NickP

+0

siehe meine Bearbeitung, wenn Ihre Abfrage null zurückgibt, dann wird es keine Summe geben, und die Summe wird Ausnahme auslösen. – Jegan

+0

Es wirft immer noch einen Fehler? Der Cast-to-Value-Typ "Double" ist fehlgeschlagen, weil der materialisierte Wert null ist. Entweder der generische Parameter des Ergebnistyps oder die Abfrage müssen einen Nullwerttyp verwenden. – NickP

-1

Ohne Zugriff auf den Rest Ihrer Logik zu verwenden, es ist ein bisschen schwierig ist, zu bestimmen, aber ich werde es versuchen. Während ich mir mehr Sorgen darüber mache, warum es überhaupt null ist, wenn null ein erwartetes Ergebnis ist, dann können Sie möglicherweise einen NULL-fähigen Typ verwenden. Sie können mehr Informationen über sie on MSDN finden. Wenn Sie einen NULL-fähigen Typ verwenden, sollten Sie auch nach dem Wert suchen, bevor Sie über diese doppelte totalDistance-Linie hinausgehen. Dies wird im MSDN-Link erläutert.

0

BTW, wenn einer dieser nicht die richtige Antwort ist, lassen Sie es mich bitte wissen, und ich werde es entfernen. Kein Grund, verrückt zu werden.

Going durch Linq query with nullable sum

Sie könnten versuchen,

double totalDistance = 
    (from g in db.Logs join h in db.Races 
    on g.raceId equals h.RaceId where g.userId == id 
    select h).Sum(x => x.distance) ?? 0; 

Ein besserer Ansatz in der Zukunft könnte nur ein nullable zu verwenden, bis Sie wissen, was los ist für den Fall, dass es eine seltsame implizite Besetzung gibt, die sich auf die Kompilierung auswirkt.EDIT: es tut

double? totalDistanceTemp = 
     (from g in db.Logs join h in db.Races 
     on g.raceId equals h.RaceId where g.userId == id 
     select h).Sum(x => x.distance); 
double totalDistance = totalDistanceTemp ?? 0; 

wenn das nicht funktioniert, können Sie versuchen, nullables Gießen. Wohlgemerkt, das ist kein Literal-Cast, sondern ein Code, der einen LINQ-Ausdruck/ein abfragbares Objekt erzeugt, das einen Cast-Ausdruck enthält, und der Cast-Ausdruck sollte übersetzt werden, um in etwas in Ihrem Backend übersetzt zu werden. Allerdings bin ich mir nicht sicher, dass unbedingt übersetzt werden müssen.

double? totalDistanceTemp = 
     (from g in db.Logs join h in db.Races 
     on g.raceId equals h.RaceId where g.userId == id 
     select h).Sum(x => (Double?) x.distance); 
double totalDistance = totalDistanceTemp ?? 0; 

oder

double? totalDistanceTemp = 
     (from g in db.Logs join h in db.Races 
     on g.raceId equals h.RaceId where g.userId == id 
     select ((Double?)h.distance)).Sum(); 
double totalDistance = totalDistanceTemp ?? 0; 

Und schließlich, wenn das nicht funktioniert: verschrauben. Holen Sie die Liste aus der Datenbank, summieren Sie sie mit LINQ to Objects (Nullable sollte nicht benötigt werden). Verwenden Sie nur als letzte Anstrengung. Du solltest/solltest du das nie tun müssen, aber vielleicht sind deine LINQ-Projekte bei jedem Provider einfach nur schäbig oder alt.

double totalDistance = 
     (from g in db.Logs join h in db.Races 
     on g.raceId equals h.RaceId where g.userId == id 
     select h.distance).AsEnumerable().Sum(); 

Wenn keines dieser Werke, muss es etwas komisch in sein wie die das heißt übersetzt join entweder ich bin fehlt oder der Anbieter tut etwas verrückt (oder keines der oben genannten, natürlich).

Verwandte Themen