2013-08-10 12 views
6

Ich versuche, Daten, die im Cache gehalten wird, zu erhalten. Aber es wirft eine Ausnahme auf "neue FilterSsrsLog" Zeile auswählen. Ausnahme: Diese Funktion kann nur von LINQ to Entitieslinq Ausnahme: Diese Funktion kann nur von LINQ zu Entities

List<ExecutionLog3> reportServerDB = UpdateCache(); 
     var reportLog = (from r in reportServerDB 
         orderby r.TimeStart descending 
         where ((model.reportName == null ? true : r.ItemPath.Contains(model.reportName)) && 
          (model.reportFolder == null ? true : r.ItemPath.Contains(model.reportFolder)) && 
          (r.TimeStart >= startDateTime) && 
          (r.TimeStart <= endDateTime) 
         ) 
        select new FilterSsrsLog 
        { 
         UserName = r.UserName, 
         ReportName = r.ItemPath, 
         ReportFolder = r.ItemPath, 
         Format = r.Format, 
         Parameters = r.Parameters, 
         TimeStart = r.TimeStart, 
         TimeEnd = r.TimeEnd, 
         TotalTime = EntityFunctions.DiffMilliseconds(r.TimeStart, r.TimeEnd) 
        }); 

aufgerufen werden, wenn i „wählen neue FilterSsrsLog“ entfernen Codeblock und schreiben „wählen r“ es funktioniert. Aber ich brauche nur diese Farben, also was kann ich tun, um dieses Problem zu lösen?

Antwort

9

Der Grund für diesen Fehler ist, dass die Abfrage im Speicher und nicht in RDBMS ausgeführt wird. Die Funktion DiffMilliseconds ist eine Markierung, die der Entity Framework-Provider in RDBMS-spezifisches SQL konvertiert, um es an Ihr RDBMS zu senden. Die Funktion berechnet ihr Ergebnis nicht, wenn sie auf einen IQueryable<T> im Speicher angewendet wird und stattdessen eine Ausnahme auslöst.

Wenn Sie diese Abfrage im Speicher ausgeführt werden, ersetzen

TotalTime = EntityFunctions.DiffMilliseconds(r.TimeStart, r.TimeEnd) 

mit

TotalTime = (r.TimeEnd - r.TimeStart).TotalMilliseconds 

Subtraktion von zwei Daten erzeugt einen TimeSpan Wert, von dem Sie seine TotalMilliseconds Eigenschaft annehmen kann.

+0

Wäre es nicht TotalMilliseconds? –

+1

@ It'sNotALie. Ah, du hast recht, es sollte 'TotalMilliseconds' sein. Vielen Dank! – dasblinkenlight

+0

@dasblinkenlight Vielen Dank, es funktioniert. –