2016-09-04 1 views
0

Ich habe eine Abfrage, die einen Wert auswählen. Der Code ist:Hinzufügen bedingten Wert in Linq von Switch-Fall

var query = from c in snd.external_invoices.OrderByDescending(x => x.date) 
      join o in snd.invoices on c.idexternal_invoices equals o.id_external_invoice 
      select new 
        { 
         c.idexternal_invoices, 
         c.businessname, 
         o.number, 
         c.message, 
         c.price, 
         c.date, 
         c.tipologiaPagamento, 
         c.esitoPagamento, 
         c.iduser 
        }; 

Jetzt muss ich einen Wert in dieser Abfrage wählen basierend auf dem Wert im Bereich c.tipologiaPagamento. Insbesondere muß ich alle um den Wert auszuwählen, wo c.date es zu diesem Schalter Ergebnis gleich ist:

  switch (c.tipologiaPagamento) 
      { 
       case "1": 
        c.date.AddDays(10); 
        break; 
       case "2": 
        c.date.AddDays(10); 
        break; 
       case "3": 
        DateTime endOfMonth = new DateTime(c.date.Year, 
            c.date.Month, 
            DateTime.DaysInMonth(c.date.Year, 
                 c.date.Month)); 
        c.date = endOfMonth; 
        break; 
       case "4": 
        DateTime nextMonth = c.date.AddMonths(1); 
        DateTime endOfNextMonth = new DateTime(c.date.Year, 
            c.date.Month, 
            DateTime.DaysInMonth(c.date.Year, 
                 c.date.Month)); 
        c.date = endOfNextMonth; 
        break; 
       default: 
        break; 
      } 

ich brauche die Werte in der Abfrage auszuwählen Also, wo c.date das Ergebnis dieses Schalters gleich .

Wie kann ich das tun?

Vielen Dank an alle

Antwort

0

Ich bin nicht sicher, Sie in einer komplexen Berechnung wie ou passieren kann leicht in eine Linq Ausdruck wollen? Jemand kann mich reparieren, wenn ich damit falsch liege.

Was ich wahrscheinlich tun würde, da Ihre Berechnung nur von Ihrem tipologiaPagamento Wert nur abhängt, und den date Wert nur in der Berechnung verwendet, die Sie in Ihrem aktuellen Ergebnis sowieso haben, nicht mich auf SQL zu stören Seite. Holen Sie sich einfach alle benötigten Informationen und stellen Sie Ihre switch-Anweisung in eine foreach -Schleife, um die Werte auf Anwendungsserverebene nach Bedarf zu aktualisieren. Wahrscheinlich wird das die Berechnung schneller machen als der SQL-Server, der nicht unbedingt für die Datenmanipulation optimiert ist, sondern mehr für den Datenabruf.

+0

Das einzige Problem mit diesem ist, dass die anonymen Typen unveränderlich sind, daher kann nicht post aktualisiert werden. –

+0

Ja, das ist richtig, Sie müssen einen Typ für die Daten erstellen, um dies zu tun. Danke @IvanStoev –

0

versuchen Sie dies:

var query = from c in snd.external_invoices.OrderByDescending(x => x.date) 
         join o in snd.invoices on c.idexternal_invoices equals o.id_external_invoice 
         where c.date== FindDate(c.tipologiaPagamento, c.date) 
         select new 
         { 
          c.idexternal_invoices, 
          c.businessname, 
          o.number, 
          c.message, 
          c.price, 
          c.date, 
          c.tipologiaPagamento, 
          c.esitoPagamento, 
          c.iduser 
         }; 



    public DateTime FindDate(string tipologiaPagamento, DateTime date) 
     { 

      DateTime Result = new DateTime(); 
      switch (tipologiaPagamento) 
      { 
       case "1": 
        Result = date.AddDays(10); 
        break; 
       case "2": 
        Result = date.AddDays(10); 
        break; 
       case "3": 
        DateTime endOfMonth = new DateTime(date.Year, 
            date.Month, 
            DateTime.DaysInMonth(date.Year, 
                 date.Month)); 
        date = endOfMonth; 
        break; 
       case "4": 
        DateTime nextMonth = date.AddMonths(1); 
        DateTime endOfNextMonth = new DateTime(date.Year, 
            date.Month, 
            DateTime.DaysInMonth(date.Year, 
                 date.Month)); 
        date = endOfNextMonth; 
        break; 
       default: 
        break; 
      } 
      return Result; 

     } 
0

Das ist nicht so klar, aber sehr effektiv:

from c in ... 
... 
select new 
    { 
    Invoices = c.idexternal_invoices, 
    Cdate = c.tipologiaPagamento == 1? c.date 
      : c.tipologiaPagamento == 2? c.date.AddDays(10) 
      : c.tipologiaPagamento == 3? new DateTime(2015,9,1) 
      : new DateTime(1970,1,1), 
    User = c.iduser 
}; 

... da es einen Teil von LINQ Ausdrucksbaum kompiliert werden kann, statt in C# Seite auszuführen.

Verwandte Themen