2011-08-31 19 views
32

Estoy tratando de obtener el primer valor en la lista y el último valor. El operador de consulta First() es compatible pero Last() y LastOrDefault() dan error. ¿Estoy usando el operador Last() de manera incorrecta?Last y LastOrDefault no son compatibles

var purchaseBills = db.PurchaseBills.OrderBy(p => p.BillID); 

    if (purchaseBills.Count() >0) 
    { 
     var firstBill= purchaseBills.First(); //This is supported 

     //Attempt 1      
     var lastBill = purchaseBills.Last(); // Not supported 

     //Attempt 2 
     var lastBill = purchaseBills.LastOrDefault(); //Not supported 

     //Attempt 3 
     var lastBill = purchaseBills.Reverse().First(); //Not supported 

     textBoxPurchaseBillFrom.Text = firstBill.BillNo.ToString(); 
     textBoxPurchaseBillTo.Text = lastBill.BillNo.ToString(); 
    } 

Actualización: --Errors--

Intento 1: El operador de consulta 'Última' no es compatible.

Intento 2: El operador de consulta 'LastOrDefault' no es compatible.

Intento 3: El operador de consulta 'Reverse' no es compatible.

+0

¿Cuál es el error? ¿Qué proveedor de consultas estás usando? –

+0

Posible duplicado de [LINQ To Entities no reconoce el método Last. ¿En serio?] (Http://stackoverflow.com/questions/7293639/linq-to-entities-does-not-recognize-the-method-last-really). Esta pregunta fue hecha un mes antes de la otra pregunta, pero esa pregunta tiene mejores respuestas. –

Respuesta

35
  • En vez de ponerla en una lista propia o llamando ToList()ToArray() yo preferiría usar AsEnumerable().
  • Adicionalmente al igual que los otros le debe tratar OrderByDescending()
  • En lugar de Count(), lo usaría Any().
+2

+1 para cualquier sugerencia(). Gracias :) – Marshal

+1

Encontré ordenar descendiendo, luego usar FirstOrDefault() funcionará. –

16

o bien se cambia el OrdenarPor a

.OrderByDescending(p => p.BillID) 

(y usar primero) o haces algo como

purchaseBills.ToArray().Last() 

si esto no es caro.

10

El problema es que no hay fácil traducción en SQL para Last o Reverse, así que o convertirlo a algo en la memoria (ToList, ToArray) si no va a haber demasiados registros, o se podría ejecutar la consulta una segunda vez, con OrderByDescending en lugar de OrderBy y use First.

2

Tiene algo que ver con el hecho de que el operador Last está tratando de enviarse al servidor SQL que no tiene el comando correspondiente. Una vez que la solución es poner un ToArray() o Tolist() al final de su llamada de DB, que hace que esa línea una llamada explícita para obtener los datos (en lugar de holgazanear la carga en cada una de las otras líneas).

12

Last no es compatible con la base de datos DB. Usted debe tratar otras técnicas:

  1. ejecutar la consulta utilizando OrderByDescending así que su artículo solicitado es lo primero.

  2. Codifique su consulta LINQ como de costumbre, pero haga cumplir Linq2Sql para procesarla en una colección CLR y luego tendrá acceso libre a todo localmente, incluido Last. Ejemplo:

    var bills = purchaseBills.ToList(); 
    var last = bills.Last(); 
    
5

Intento no utilizar LastOrDefault() porque alguna vez no funciona o es compatible. Estoy ordenando id por desc y luego tomo los primeros registros.

.OrderByDescending(o=>o.id) 
.FirstOrDefault(s => s.Name == Name) 
+0

El mismo problema, cambié linq para usar orderby descendiendo, luego usé FirstOrDefault() en lugar de LastorDefault. –

1

Sin embargo, otra manera de acceder al último elemento sin el orderbydescending y cargar todas las entidades:

var lastBill = purchaseBills 
    .Where(f => f.BillID == purchaseBills.Max(f2 => f2.BillID)) 
    .FirstOrDefault(); 
Cuestiones relacionadas