2013-08-10 8 views
6

Sto cercando di ottenere dati che sono conservati nella cache. Ma lancia un'eccezione sulla riga "select new FilterSsrsLog". Eccezione: Questa funzione può essere invocata solo da LINQ to Entitieseccezione di linq: questa funzione può essere invocata solo da LINQ alle entità

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) 
        }); 

Se rimuovo "Seleziona nuovo FilterSsrsLog" blocco di codice e scrivere "selezionare r" funziona. Ma ho bisogno solo di quelle colonne, quindi cosa posso fare per risolvere questo problema?

risposta

9

Il motivo per cui si sta verificando questo errore è che la query viene eseguita in memoria, non in RDBMS. La funzione DiffMilliseconds è un contrassegno che il provider di Entity Framework converte in SQL specifico di RDBMS da inviare al RDBMS. La funzione non calcola il risultato quando è applicata a un IQueryable<T> in memoria, generando invece un'eccezione.

Se si desidera eseguire questa query in memoria, sostituire

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

con

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

sottrazione di due date produce un valore TimeSpan da cui si può prendere la sua proprietà TotalMilliseconds.

+0

Non sarebbe TotalMilliseconds? –

+1

@ It'sNotALie. Ah, hai ragione, dovrebbe essere "TotalMilliseconds". Grazie! – dasblinkenlight

+0

@dasblinkenlight Grazie mille, funziona. –

Problemi correlati