2016-03-25 6 views
3

Ich habe eine StudentReceipts Tabelle, die ReceiptNo als string(001,002,003,..,099,..) speichert.Linq Ausnahme: Funktion kann nur von linq zu Entitäten aufgerufen werden

Ich möchte gehen, die letzten quittsno Details zu erhalten, um die Quittung für die nächste Transaktion zu erhöhen.

Dies ist, was ich

var _lastGeneratedRecDetails = _db.StudentReceipts 
           .AsEnumerable() 
           .Where(r => r.Status == true 
              && EntityFunctions.TruncateTime(r.DueDate.Value) >= _startDate.Date 
              && EntityFunctions.TruncateTime(r.DueDate.Value) <= _endDate.Date)             
              .OrderByDescending(x => Int32.Parse(x.ReceiptNo)) 
              .FirstOrDefault(); 

versucht haben, aber es ich die folgende Ausnahme bin immer

diese Funktion nur von Linq zu Entitäten

Jede Hilfe aufgerufen werden kann, wird sehr geschätzt werden.

+0

Sie können die numerische Reihenfolge fälschen, indem Sie nach Länge und dann nach Wert sortieren. Keine Notwendigkeit für eine Konvertierung. –

+0

Mit "Reihenfolge nach Länge" denke ich, dass Sie 'Ordering by Id' meinten. Wenn das der Fall ist, funktioniert es nicht, da die letzte Zeile möglicherweise nicht den' neusten receivyno' enthält. – ksg

+0

Nein, ich meine 'OrderByDescending (x => x.ReceiptNo.Length) .ThenByDescending (x => x.ReceiptNo) ' –

Antwort

6

Mit dem Aufruf .AsEnumerable() gehen Sie von Linq-To-Entities zu Linq-To-Object. Wenn Sie es aufrufen, filtern Sie auch alle Ergebnisse im Speicher. Sie ziehen also die gesamte Tabelle StudentReceipts aus der Datenbank, wenn Sie diese Abfrage ausführen, da sie nach der Methode .AsEnumerable() ausgeführt wird. Die allgemeine Regel ist, zu versuchen, so viel wie möglich auf der Datenbankseite zu tun:

var _lastGeneratedRecDetails = 
    _db.StudentReceipts.Where(r => r.Status == true 
         && EntityFunctions.TruncateTime(r.DueDate.Value) >= _startDate.Date 
         && EntityFunctions.TruncateTime(r.DueDate.Value) <= _endDate.Date)    
         .AsEnumerable()         
         .OrderByDescending(x => Int32.Parse(x.ReceiptNo)) 
         .FirstOrDefault(); 

Wenn Sie es so tun, werden Sie alles, was in der Datenbank filtern und die gefilterten Ergebnisse holen. Ich weiß nicht, welcher Typ x.ReceiptNo ist, aber Calling Int.Parse ist in Linq-To-Entities nicht erlaubt. Sie können zuerst filtern und anschließend AsEnumerable aufrufen, um das Parsing und die Sortierung im Speicher durchführen zu können.

+0

Danke für die Antwort mate. Aber wenn ich die obige Abfrage versuchte, bekomme ich den Fehler "Wert kann nicht null sein." Wenn ich '.OrderByDescending (x => Int32.Parse (x.ReceiptNo))' zu '.OrderByDescending (x => x.ReceiptNo) 'die Abfrage funktioniert.Aber noch hat Zweifel, wie' absteigend' arbeitet auf 'string' Werte – ksg

+0

@ksg Sie können versuchen, OrderByDescending (x => x.ReceiptNo! = null? Int32.Parse (x.ReceiptNo): 0) 'mit '0' als Standardwert, wenn es null ist –

+0

Dank mate funktioniert es.Vergiss, dass es eine Möglichkeit von Null geben könnte. :) – ksg

Verwandte Themen