2013-03-27 16 views
11
Context db = new Context(); 
List<Invoice> invoice = 
(from LocalInvoice in db.Invoices 
where LocalInvoice.Site_Id == this.SiteIdentifier 
select LocalInvoice).ToList(); 

Restituisce un elenco di record. Voglio selezionare l'ultimo della lista. Ho provato .ToList().LastOrDefault(); ma l'errore non è possibile convertire il tipo 'fattura' in 'System.Collections.Generic.List.ottiene l'ultimo nella lista LINQ

Perché è Dicendo questo, non l'ho dichiarato su fattura di un elenco List<Invoice> invoice

Qualsiasi aiuto molto apprezzato. Ta


EDIT Grazie per la risposta a tutti ho provato tutto quello che hanno consigliato e ogni volta im ottenere l'errore: l'operatore di query 'LastOrDefault' non è supportato.

In realtà non ho spiegato cosa sto cercando di fare nel complesso che potrebbe causare un problema. Ho una tabella contenente tutte le fatture, ognuna con un 'id' separato. Tuttavia, ogni record avrà una colonna SiteIdentifier che viene utilizzata più volte per fatture diverse. Quindi ogni sito può avere più fatture.

Cercando di ottenere la fattura più recente per il sito. Così dicono fattura

id SiteIdentifier 
73 25 
74 25 
75 25 

stavo cercando di ottenere tutti i record in cui il SiteIdentifier == this.SiteIdentifier (EG25), quindi vedere la scheda più recente che avrebbe beeing fattura id 75.

Qualcuno ha qualche idea? Ancora grazie per tutto l'aiuto

risposta

23

LastOrDefault restituirà un singolo elemento. Non dovresti chiamare ToList senza prima applicare un filtro, ma recupererebbe tutte le righe dal database mentre ne hai solo bisogno.

var invoice = db.Invoices.LastOrDefault(s => s.Site_Id == this.SiteIdentifier); 

Inoltre, è necessario applicare l'ordine se si sta eseguendo una query su una tabella relazionale. LastOrDefault è significativo solo con le raccolte in memoria. Sembra che non sia supportato in EF e genererà un'eccezione.

migliore soluzione è quella di invertire l'ordine e utilizzare FirstOrDefault metodo:

var invoice = db.Invoices.OrderByDescending(s => s.Id) 
         .FirstOrDefault(s => s.Site_Id == this.SiteIdentifier); 
+0

Grazie per la risposta si prega di consultare la sezione Modifica – John

+0

@ John leggere il mio secondo esempio. Dovrebbe funzionare. –

+0

il secondo esempio funziona ma SOLO per primo o predefinito. temo di aver bisogno in particolare del record più recente nel DB. .l'ultimo sta generando un errore L'operatore di query 'Last' non è supportato. e lastordefault è uguale all'errore originale nel mio post originale. Hai qualche idea? – John

5

LastOrDefault restituirà un'istanza di una fattura, non una raccolta, quindi modificare il tipo di variabile.

Invoice invoice = 
    (from LocalInvoice in db.Invoices 
    where LocalInvoice.Site_Id == this.SiteIdentifier 
    select LocalInvoice).LastOrDefault(); 

o detergente ancora:

var invoice = db.Invoices.LastOrDefault(i => i.Site_Id == this.SiteIdentifier); 
+0

Grazie per la risposta consultare modifica – John

0

LastOrDefault restituirà un singolo elemento, non un List. Questo dovrebbe funzionare:

Invoice invoice = 
    (from LocalInvoice in db.Invoices 
    where LocalInvoice.Site_Id == this.SiteIdentifier 
    select LocalInvoice) 
    .LastOrDefault(); 
+0

Davvero inefficiente! Richiederà il database per tutti i record e durerà per l'applicazione, non sul lato del database. – MarcinJuraszek

+0

Grazie per la risposta, vedi modifica – John