2009-09-01 14 views
8

Ho esteso le mie entità per implementare interfacce specifiche per il suo tipo. Sto cercando di eseguire la seguente query:Trasmetti risultati Linq su Elenco <MyInterface>

var results = from x in context.MyEntityTable 
       where x.AProperty == AValue 
       select x; 

return results.Count() > 0 ? results.Cast<IApplicationEntity>().ToList() : null; 

Tuttavia, continuo a ricevere il seguente errore:

"LINQ to Entities supporta solo la fusione del modello Entity Data tipi primitivi"

Fondamentalmente quello Voglio fare è sempre convertire i risultati dal tipo di entità grezza in un elenco generico dell'interfaccia che implementa.

È possibile?

risposta

20

Si può fare il cast sul client, bypassando il livello di conversione di query Entity Framework chiamando il metodo AsEnumerable estensione:

return results.Any() 
     ? results.AsEnumerable().Cast<IApplicationEntity>().ToList() 
     : null; 

Tuttavia, è meglio invertire l'ordine di fare il check-Count:

var list = results.AsEnumerable().Cast<IApplicationEntity>().ToList(); 
return list.Count == 0 ? null : list; 
+1

+1, tuttavia questo eseguirà due query DB (per Count e ToList) ... probabilmente sarebbe meglio chiamare ToList prima, quindi controllare il numero di articoli –

+0

@Thomas: Guarda la seconda query. –

+0

Sì, è meglio;) –

0
return results.Count() > 0 ? 
results.Select(result => (IApplicationEntity)result) 
.ToList() : null; 
+0

Non penso che funzionerà, per la stessa ragione per cui il metodo Cast non lo fa. È necessario convertire la query in IEnumerable prima –

+0

Il messaggio indica che non sa come trasformare l'operatore Cast() in linq in entità. Questo è in realtà un codice scritto dal provider del provider linq (ad esempio Linq to Sql, linq to Objects ecc.) Altri poster hanno proposto di modificare la chiamata ad AsEnumerable per forzare l'uso di Linq agli oggetti e quindi avere l'operatore Cast() ha successo. Stavo facendo la stessa cosa ma usando C# invece proiettando esplicitamente un cast nel codice. Provalo e fammi sapere se ha funzionato. – Spence

3

Se vuoi lanciare i risultati a un tipo complesso, è necessario forzare il codice per utilizzare LINQ to Objects, piuttosto che LINQ to Entiti es.

Chiamare il metodo di estensione AsEnumerable prima del cast è il trucco qui.

provare quanto segue:

var results = from x in context.MyEntityTable 
       where x.AProperty == AValue 
       select x; 

return results.AsEnumerable().Cast<IApplicationEntity>().ToList(); 

Si noti inoltre che non è consigliabile controllare Count() sul enumerabile, dal momento che la raccolta viene iterato più del doppio.

+0

In realtà, questo non funzionerà. Dovresti fare il 'AsEnumerable' * prima * del cast. Altrimenti, EF proverà a tradurlo in una query da eseguire sul provider. –

+0

@Mehrdad: troppo veloce per il tuo bene. Ho modificato il post poco prima del tuo commento. ;) – Noldorin

Problemi correlati