2009-08-11 15 views
10

Sono nuovo a LINQ e LINQ a SQL e non capisco cosa c'è di sbagliato in questo codice. Il Excetpion.Message ottengo è.NET: Last LINQ (

"L''Operatore di query' Last 'non è supportato."

Quello che sto cercando di fare è ottenere il più recente LastActivityUtc degli ultimi 100. Il codice segue.

var postTimes = from post in db.Post 
       where post.LastActivityUtc != null 
       orderby post.LastActivityUtc descending 
       select post.LastActivityUtc; 

DateTime startDate = DateTime.MinValue; 

if (postTimes.Count() >= 2) 
{ 
    startDate = postTimes.Take(100).Last().Value; 
} 

risposta

20

Brandon ha pubblicato una soluzione, ma richiede copiare l'intera lista in memoria.

Se si desidera solo, è possibile utilizzare per "transizione" da query di database a in-process AsEnumerable:

startDate = postTimes.Take(100).AsEnumerable().Last().Value; 

Detto questo, è forse fai voler chiamare ToList(), ma in precedenza - per evitare di dover eseguire la query una volta per il conteggio, e una volta per l'ultimo valore:

var postTimes = (from post in db.Post 
       where post.LastActivityUtc != null 
       orderby post.LastActivityUtc descending 
       select post.LastActivityUtc).Take(100).ToList(); 

DateTime startDate = DateTime.MinValue; 

if (postTimes.Count >= 2) 
{ 
    startDate = postTimes.Last().Value; 
} 

che eseguirà le query di database volta, ma solo prendere il i primi 100 record in memoria. Certamente, cade un po 'se tu dovessi usare postTimes altrove ...

+1

Ratti, a quanto pare, la mia risposta iniziale non era affatto stupida! Do la colpa a Marc;) –

+0

@ Mehrdad - Accetto umilmente la responsabilità! – Marc

+2

Chi è più sciocco? Il pazzo, o il pazzo che lo segue? –

4

chiamata ToList() su postTimes e quindi provare a utilizzare .Last()

startDate = postTimes.Take(100).ToList().Last().Value; 
+1

Questo funzionerebbe ma non per il motivo che hai menzionato. '.AsEnumerable()' invece di '.ToList()' funzionerebbe anche. Il motivo per cui questi due funzionano è che non provano a tradurre l'espressione in SQL. Recuperano solo 100 righe e lo elaborano sul client. –

+0

Errore mio, rimuoverò quella parte della mia risposta. – Brandon