2017-05-19 4 views
0

Ich habe Probleme beim Verfassen einer LINQ-Anweisung, die einen bedingten Operanden innerhalb der WHERE-Klausel verwendet und durch diese Website nach einem ähnlichen Problem ohne Glück durchgesehen haben. Ich bin mir sicher, dass es eine bessere Möglichkeit gibt, diese Abfrage auszudrücken. Der Wert XXX innerhalb der ist das Ergebnis der Bestimmung, welches Feld im Objekt für den Vergleich verwendet wird und wird im Folgenden erläutert.LINQ-Abfrage benötigt einen bedingten Operanden in der WHERE-Klausel

Im Folgenden finden Sie, was ich versuche zu erreichen: aber

var paymentReceivedAmt = (from registerEntry in RegisterEntries 
    where registerEntry.TransactionType != null 
    && registerEntry.TransactionType.Id.SubsystemCode == "A" 
    && registerEntry.Receipt != null 
    && registerEntry.PostDate != null 
    && XXX >= lastInvoicedDate 
    select registerEntry.TransactionAmount.GetValueOrDefault(0)).Sum(); 

Wert XXX =

if registerEntry.AddedDate = registerEntry.PostDate 
    registerEntry.AddedDate 
else 
    registerEntry.PostDate 

Die Werte registerEntry.AddedDate und registerEntry.PostDate ist Datetime-Typ, wenn ich das nur noch im Vergleich zu vergleichen Datum und nicht die Zeit

Hat jemand eine Idee, wie man das macht?

+0

Msdn viele gute Proben hat: https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng

+0

Meinen Sie Einsatz statt Gleichheit? 'if registerEntry.AddedDate = registerEntry.PostDate' ist nicht dasselbe wie' if registerEntry.AddedDate == registerEntry.PostDate' (beachte das doppelte Gleichheitszeichen) –

Antwort

0

auf dem LINQ-Provider Je Sie verwenden können Sie versuchen, die ternary operator:

var paymentReceivedAmt = (from registerEntry in RegisterEntries 
    where registerEntry.TransactionType != null 
    && registerEntry.TransactionType.Id.SubsystemCode == "A" 
    && registerEntry.Receipt != null 
    && registerEntry.PostDate != null 
    && (registerEntry.AddedDate == registerEntry.PostDate 
      ? registerEntry.AddedDate 
      : registerEntry.PostDate) >= lastInvoicedDate 
    select registerEntry.TransactionAmount.GetValueOrDefault(0)).Sum(); 
+1

Das ist es! Ich dachte an eine ternäre Lösung, war mir aber nicht sicher, wie ich es ausdrücken sollte. Vielen Dank für Ihre Hilfe !!! –

3

Warum nicht einfach registerEntry.PostDate für XXX verwenden? Wenn es verwenden, um registerEntry.AddedDate, könnte genauso gut es gleich und vereinfachen das Ganze

var paymentReceivedAmt = (from registerEntry in RegisterEntries 
    where registerEntry.TransactionType != null 
    && registerEntry.TransactionType.Id.SubsystemCode == "A" 
    && registerEntry.Receipt != null 
    && registerEntry.PostDate != null 
    && registerEntry.PostDate >= lastInvoicedDate 
    select registerEntry.TransactionAmount.GetValueOrDefault(0)).Sum(); 
+0

Vielen Dank für Ihre Hilfe. Ich glaube, ich habe vergessen zu erwähnen, dass, wenn das AddedDate den gleichen Wert wie das PostDate hatte (Datum nur Wert), ich dann den ältesten der beiden Werte mit dem Rechnungsdatum vergleichen musste. Das PostDate ist ein DateTime-Typ, aber alle Zeiten auf diesen Werten werden immer auf 00:00:00 festgelegt und ich konnte den Code nicht ändern, um die tatsächliche Zeit einzuschließen, ohne schwerwiegende Auswirkungen in dem Rest der Anwendung zu haben. Danke nochmal !!! –

+0

@ScottChappa - wenn "AddedDate" und "PostDate" den gleichen Wert haben, ** sie sind das gleiche Datum **, es gibt kein älteres als das andere. Wenn Ihr Modell den Begriff 'Null' für eine 'DateTime' hat, sollten Sie ein Nullable verwenden - 'DateTime?'. – DigiFriend

Verwandte Themen