2009-09-01 2 views
8

Ich habe meine Entitäten erweitert, um spezifische Schnittstellen für seinen Typ zu implementieren. Ich versuche, die folgende Abfrage ausführen:Cast linq Ergebnisse zu Liste <MyInterface>

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

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

Allerdings halte ich die folgende Fehlermeldung erhalten:

"LINQ to Entities unterstützt nur Entity Data Model Urtyp Casting"

Im Grunde, was Ich möchte immer die Ergebnisse vom rohen Entitätstyp in eine generische Liste der Schnittstelle konvertieren, die es implementiert.

Ist das möglich?

Antwort

20

Sie die Besetzung auf dem Client tun, die Entity Framework Abfrage Übersetzungsschicht unter Umgehung von AsEnumerable Erweiterung Methode aufrufen:

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

Allerdings ist es besser, die Reihenfolge zu tun, die Count Scheck zu umkehren:

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

+1, jedoch wird dies zwei DB-Abfragen ausführen (für Count und für ToList) ... es wäre wahrscheinlich besser vorher ToList aufzurufen und dann die Anzahl der Elemente zu überprüfen –

+0

@Thomas: Sehen Sie sich die zweite Abfrage an. –

+0

Ja, das ist besser;) –

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

Ich glaube nicht, dass es funktioniert, aus dem gleichen Grund, die Cast-Methode nicht. Sie müssen die Abfrage zunächst in IEnumerable umwandeln. –

+0

Die Nachricht besagt, dass sie nicht weiß, wie der Operator Cast() in linq in Entitäten umgewandelt werden kann. Dies ist eigentlich Code, der vom Provider des linq Providers geschrieben wurde (zB Linq to Sql, linq to Objects etc.) Andere Plakate haben vorgeschlagen, den Aufruf von AsEnumerable zu ändern, um den Einsatz von Linq zu Objekten zu erzwingen und damit zu haben Der Operator Cast() ist erfolgreich. Ich machte dasselbe, aber stattdessen C#, indem ich explizit einen Cast in den Code projizierte. Probieren Sie es aus und lassen Sie mich wissen, ob es funktioniert hat. – Spence

3

Wenn Sie Ihre Ergebnisse zu einem komplexen Typ umwandeln möchten, müssen Sie den Code zwingen LINQ to Objects zu verwenden, anstatt LINQ to Entiti es.

Der Aufruf der Erweiterungsmethode AsEnumerable vor der Besetzung ist hier der Trick.

Versuchen Sie Folgendes:

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

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

Beachten Sie auch, dass es nicht klug ist Count() auf der zählbare zu überprüfen, da es bedeutet, dass die Sammlung zweimal iteriert wird.

+0

Eigentlich wird das nicht funktionieren. Du solltest das 'AsEnumerable' * vor dem Cast machen. Andernfalls versucht EF, sie in eine Abfrage zu übersetzen, die auf dem Anbieter ausgeführt wird. –

+0

@Mehrdad: Zu schnell für Ihr eigenes Wohl. Ich habe den Beitrag kurz vor deinem Kommentar bearbeitet. ;) – Noldorin