2016-05-13 3 views
0

Ich habe eine nicht nullable Feld (Num)C# Entity Framework select max nach dem Filter nicht auf NULL festlegbare Bereich

class MyTable 
{ 
    //... 
    public int Num { get; set; } 
    public string Category { get; set; } 
    //... 
} 

wollen maximal finden Num für Category == "A"

var maxnum = myTable 
    .Where(r => r.Category == "A") 
    .Max(r => r.Num); 

das Problem aufgetreten ist, wenn es war keine Aufzeichnung von category == "A". Da das Ergebnis der Where() null ist, so wird das Ergebnis von Max() null sein, aber wenn Num nicht NULL-Werte zulässt die Ausnahme aufgetreten ist.

Ich kann es beheben, indem Num als Nullable in Tabelle Design, aber ich mag diese Lösung nicht, während Num sollte Wert und sollte nicht Nullable sein.

Irgendwelche Vorschläge? Gibt es eine Möglichkeit, dass ich einen Nullwert für Num akzeptiere, während Num nicht nullbar ist? oder eine bessere Abfrage?

+0

so, wenn die 'Wo. (R => r.Category.Equals („A“)' Teil der Abfrage ist null und 'Num' NULL ist nicht zulässig, würde ich erwarten, dass es eine Ausnahme geben, da gibt es keine Aufzeichnungen von 'Num' wo' Category.Equals ("A") '? so schauen Sie in' DefaultIfEmpty' –

+0

See [DefaultIfEmpty()] (https://msdn.microsoft.com/en-us/library/ bb360179 (v = VS.100) .aspx) – sammarcow

Antwort

5
int maxShoeSize = Workers.Where(x => x.CompanyId == 8) 
        .Select(x => x.ShoeSize) 
        .DefaultIfEmpty(0) 
        .Max(); 

See: Max return value if empty query

+0

OK doppelte Frage!, während ich diese Frage nicht auf der Suche finden konnte, trotzdem füge ich einige Tags auf diese Frage vielleicht später besseres Suchergebnis hilft. – Hamid

2

Gibt es eine Möglichkeit, dass ich null Wert für Num akzeptieren, während Num NULLABLE nicht wahr?

Sicher können Sie:

//... 
.Max(r => (int?)r.Num); 

Jede nicht auf NULL festlegbaren Wert kann in nullable gedreht werden (aber nicht umgekehrt). Ich persönlich bevorzuge diese Methode (die acually in der Ausnahmemeldung vorgeschlagen wird), weil es mir zwischen keinem Maximalwert und Maximalwert von 0 (Null) oder sogar int.MinValue unterscheiden kann.

+0

UP für die zusätzliche Beantwortung bitten Ich denke, DefaultIfEmpty ist eine bessere Lösung für solche Fragen, aber wie Sie es empfohlen haben, ist es besser, wenn wir nicht 0 für leer bekommen möchten. – Hamid

0

können Sie versuchen:

var maxnum = myTable 
    .Where(r => r.Category == "A") 
    .Max(r => r.Num) ?? 0; 

Dann können Sie mit dem 0 Ergebnis arbeiten.

Verwandte Themen