2009-08-24 6 views
13

ich eine LINQ-Abfrage, die wie folgt aussieht ...Wie ein Linq Sum return null machen, wenn die summierten Werte sind alle null

var duration = Level3Data.AsQueryable().Sum(d => d.DurationMonths); 

Wenn die alle d.DurationMonths Werte sind null die Summe zurückgibt 0. Wie kann ich die Summe null zurückgeben, wenn alle d.DurationMonthsnull sind? Oder muss ich zuerst eine separate Abfrage ausführen, um diese Situation zu beheben, bevor die Summe ausgeführt wird?

+0

Was ist die Art der DurationMonths? int? 'Nullable '? –

+0

DauerMonate ist int? –

Antwort

11

Zusammen mit dem vorherigen Vorschlag für eine Erweiterungsmethode - Sie einen ternären Operator verwenden könnten ...

var duration = Level3Data.AsQueryable().Any(d => d.DurationMonths.HasValue) 
       ? Level3Data.AsQueryable().Sum(d => d.DurationMonths) 
       : null; 
+6

Diese Abfrage zählt die Ergebnisse zweimal ... –

+2

Obwohl dies die Ergebnisse zweimal aufzählt, sind Meine Sammlungen klein und ich finde dies am besten lesbar. Also habe es akzeptiert. Danke an alle. –

1

Mit Sum allein, das ist unmöglich. Wie Sie in Ihrer Frage angegeben ist, müssen Sie für diese Situation überprüfen, bevor Sie Summe nennen:

var q = Level3Data.AsQueryable(); 
var duration = q.All(d => d.DurationMonths == null) 
        ? null 
        : q.Sum(d => d.DurationMonths); 
+0

Bah, weniger als eine Minute zu spät. Lol –

3

können Sie Aggregate verwenden, um benutzerdefinierte Aggregationscode zur Verfügung zu stellen:

var items = Level3Data.AsQueryable(); 
var duration = items.Aggregate<D,int?>(null, (s, d) => (s == null) ? d.DurationMonths : s + (d.DurationMonths ?? 0)); 

(unter der Annahme, die Elemente in Level3Data sind vom Typ D)

+0

Die '+ =' sollte eigentlich nur '+' sein. – GSerg

+0

@GSerg, behoben, danke! –

-1

Wenn Sie das Ergebnis ohne zwei Abfragen möchten versuchen:

var duration = Level3Data.AsQueryable(). Summe (d => (double?) D.DurationMonths);

Wenn Sie Null anstelle von null als Ergebnis dieser Abfrage verwenden möchten.

var Dauer = Level3Data.AsQueryable() Summe (? D => (double) d.DurationMonths) ?? 0;

+0

Ich persönlich mag diese Option am meisten. – TravisWhidden

+3

Wenn ['DurationMonths' ist' int? '] (Http://stackoverflow.com/questions/1322544/how-to-make-a-linq-sum-return-null-if-the-summed-values-are -all-null # comment1156228_1322544) und alle Werte sind 'null', Linq2Sql gibt 'null' für' Sum' zurück, und Linq2Objects gibt '0' zurück. Das OP hat die "0" zurückgegeben, also benutzen sie Linq2Objects, in diesem Fall wird das Casting auf 'double?' Vor der Summierung [nicht funktionieren] (http://stackoverflow.com/questions/1322544/how-to-make- a-linq-sum-return-null-wenn-die-summierten-werte-sind-alle-null # comment69281108_16441725) und das Ergebnis wird immer noch "0". – GSerg

3
var outputIndicatorSum = (from OutputIndicatorTable in objDataBaseContext.Output_Indicators 
              where OutputIndicatorTable.Output_Id == outputId 
              select (int?)OutputIndicatorTable.Status).Sum(); 
       int outputIndicatorSumReturn = Convert.ToInt32(outputIndicatorSum); 
       return outputIndicatorSumReturn; 

Sie können nicht-nullbare Varable-Zeichen explizit in Nullable-Typen eingeben. i.e, select (int?)OutputIndicatorTable.Status).Sum();

+1

Diese Antwort ist falsch. Casting nach '(int?)' Vor der Summierung ist im Kontext von Linq2Sql sinnvoll, wobei 'Sum' (auch aus der SQL-Abfrage)' null' zurückgeben kann, auch wenn der Compiler nicht nullbare Ergebnisse liefert, die zu einer Ausnahme führen. Mit 'Linq2Objects' gibt 'Sum' immer '0' zurück, auch wenn alle Eingabeelemente 'null' waren oder gar keine Eingabeelemente vorhanden waren. – GSerg

Verwandte Themen