2009-08-11 9 views
10

Soy nuevo en LINQ y LINQ en SQL y no entiendo qué le pasa a este código. El Excetpion.Message que obtengo es.NET: LINQ's Last()

"El operador de la consulta 'Última' no es compatible."

Lo que estoy tratando de hacer es obtener el primer LastActivityUtc de los últimos 100. El código sigue.

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

Respuesta

20

Brandon ha publicado una solución , pero requiere la copia de toda la lista en la memoria.

Si lo que desea es "transición" de consultas de bases de datos en el proceso, puede utilizar AsEnumerable:

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

Una vez dicho esto, que posiblemente hace desee llamar a ToList(), pero antes - para evitar tener que ejecutar la consulta una vez para el recuento, y una vez para el último valor:

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

que ejecutará la consulta a la base vez, pero sólo buscar el primeros 100 registros en la memoria. Por supuesto, se cae un poco si fuera a usar postTimes en otro lugar ...

+1

¡Ratas, aparentemente, mi respuesta inicial no fue en absoluto estúpida! Lo culpo a Marc;) –

+0

@Mehrdad - ¡Acepto humildemente la responsabilidad! – Marc

+2

¿Quién es más tonto? ¿El tonto, o el tonto que lo sigue? –

4

llamada .ToList() en postTimes y luego tratar de usar .Last()

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

Esto funcionaría, pero no por la razón que usted mencionó. '.AsEnumerable()' en lugar de '.ToList()' también funcionaría. La razón por la que estos dos funcionan es porque no intentan traducir la expresión a SQL. Solo recuperan 100 filas y lo procesan en el cliente. –

+0

Mi error, eliminaré esa parte de mi respuesta. – Brandon

Cuestiones relacionadas