IQueryable-Liste
Ich bin mit System.Linq -.Dynamische, mir zu erlauben, dynamisch eine Liste der Felder aus einer Abfrage wie diese:
finalQuery = query.Select(string.Format("new({0})", string.Join(",", selectors)));
Wo selectors
ist nur ein List<string>
mit alle Felder die ich möchte. Dies funktioniert gut, aber diese version von der extension-Methode Select
gibt ein IQueryable
. Nicht dies ist nicht IQueryable<T>
. Wenn ich eine IQueryable<T>
ich kann einfach nicht ein .ToList()
konvertieren es in eine Liste, und erzwingen Sie die Abfrage, um tatsächlich auf der Datenbank ausgeführt, aber das mit dem nicht-generischen IQueryable
, dass die Methode nicht existiert.
Dies ist, weil ToList
ist geerbt von IEnumerable<T>
die IQueryable<T>
erbt und IQueryable
offensichtlich nicht.
Also, was ist der effizienteste Weg, um eine IQueryable
führen Sie die Abfrage aus und geben mir wieder eine Liste? Ich kann dies tun:
List<object> rtn = new List<object>();
foreach (var o in finalQuery)
{
rtn.Add(o);
}
Aber es scheint, wie Ihre sollte ein einfacher Weg.
Edit: In Reaktion auf Vorschläge, die ich beide ausprobiert:
finalQuery.Cast<object>().ToList();
und:
finalQuery.Cast<dynamic>().ToList();
Welche beide geben NotSupportedExceptions
mit der Meldung:
Unable to cast the type 'DynamicClass1' to type 'System.Object'. LINQ to Entities
only supports casting EDM primitive or enumeration types.
- mögliche Duplikate von Wo ist die ToList () - Methode? (IQueryable)
- haben Sie versucht, die Besetzung? msdn.microsoft.com/en-us/library/vstudio/...
- Und was beabsichtigen Sie, Stimmen Sie zu?
- Guter Punkt, ha vergaß seine dynamische
- Ich habe versucht, casting, um
object
und es nicht gefallen, dass überhaupt.NotSupportedException
, "unable to cast type 'DynamicClass1' zum Typ 'System.Objekt'" - Es ist klar (vielen Dank für die bringen Sie es auf), aber beantwortet nicht meine Frage. Reed ' s Antwort ist zu schließen, durch die
ArrayList
er postet nicht wirklich funktioniert.IQueryable
ist nichtICollection
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies scheint eine Einschränkung in der Weise, LINQ to Entities übersetzt
IQueryable.Cast
mit anonymen Typen. Sie können umgehen dies, indem Sie als eineIEnumerable
(dein Beispiel tut dies). Dies bewirkt, dass der code für die Besetzung in der .NET-runtime nach es werden aus der DB, anstatt zu versuchen, es zu handhaben, die in DB-engine. E. g.Oder
Cast<dynamic>()
schon und das gibt mir einNotSupportedException
. Dabei einforeach
zu sein scheint, die einzige Sache, die funktioniert, die ist irgendwie merkwürdig.IQueryable
- und Sie tun eineCast<>
verlangt, eine andere Methode, als wenn es einIEnumerable
. Wenn esIQueryable
sagt es LINQ to Entities, die es will, zu werfen. Wenn es eineIEnumerable
es nicht so etwas wie Ihrforeach
.IEnumerable
eher alsIQueryable
. Das Umschalten funktioniert tatsächlich. Danke.