Ist der Zweck AsQueryable()
nur so, dass Sie eine IEnumerable
Methode weitergeben können, die Sie vielleicht erwarten IQueryable
, oder gibt es einen nützlichen Grund, IEnumerable
als darzustellen IQueryable
? Zum Beispiel soll es für Fälle wie diesen sein:
IEnumerable<Order> orders = orderRepo.GetAll();
// I don't want to create another method that works on IEnumerable,
// so I convert it here.
CountOrders(orders.AsQueryable());
public static int CountOrders(IQueryable<Order> ordersQuery)
{
return ordersQuery.Count();
}
Oder macht es tatsächlich etwas anderes:
IEnumerable<Order> orders = orderRepo.GetAll();
IQueryable<Order> ordersQuery = orders.AsQueryable();
IEnumerable<Order> filteredOrders = orders.Where(o => o.CustomerId == 3);
IQueryable<Order> filteredOrdersQuery = ordersQuery.Where(o => o.CustomerId == 3);
// Are these executed in a different way?
int result1 = filteredOrders.Count();
int result2 = filteredOrdersQuery.Count();
IQueryable
Bauen die Versionen dieser Erweiterungsmethoden nur einen Ausdruck auf, der nach seiner Ausführung dasselbe tut? Meine Hauptfrage ist, was ist ein realer Anwendungsfall für die Verwendung AsQueryable
?
quelle
IQueryable<T>
ergibt sich ausIEnumerable<T>
können Sie mir bitte erklären , was Sie unter „nicht-zählbare basierend IQueryable“?IQueryable
, das mehr als nur ein Wrapped istIEnumerable
und das tatsächlich die zusätzlichen Fähigkeiten eines nutztIQueryable
.Der gültigste Fall für AsQueryable ist das Testen von Einheiten. Angenommen, ich habe das folgende etwas erfundene Beispiel
und ich möchte einen Komponententest schreiben, um sicherzustellen, dass der Controller die vom Repository zurückgegebenen Ergebnisse zurückgibt. Es würde ungefähr so aussehen:
Wo wirklich alles, was die AsQueryable () -Methode mir erlaubt, ist, den Compiler beim Einrichten eines Mocks zufrieden zu stellen.
Mich würde interessieren, wo dies im Anwendungscode verwendet wird.
quelle
Wie sanjuro bemerkte, wird der Zweck von AsQueryable () unter Verwenden von AsQueryable mit Linq To Objects und Linq To SQL erläutert . Insbesondere heißt es in dem Artikel:
quelle
Der Zweck von AsQueryable () wird in diesem Artikel ausführlich erläutert. Verwenden von AsQueryable mit Linq To Objects und Linq To SQL
Aus dem Abschnitt "Bemerkungen" der MSDN Queryable.AsQueryable-Methode:
Das ist genau das, was im obigen Artikel erwähnt und verwendet wird. In Ihrem Beispiel hängt es davon ab, was orderRepo.GetAll zurückgibt, IEnumerable oder IQueryable (Linq to Sql). Wenn IQueryable zurückgegeben wird, wird die Count () -Methode in der Datenbank ausgeführt, andernfalls wird sie im Speicher ausgeführt. Schauen Sie sich das Beispiel im Artikel an, auf den verwiesen wird.
quelle
IQueryable
Dokumentation zu Schnittstellenzitaten :Für jemanden, der beabsichtigt, seine Datenstruktur in .NET abfragbar zu machen, kann die nicht erforderliche Datenstruktur aufgelistet werden oder einen gültigen Enumerator haben .
IEnumerator
ist eine Schnittstelle zum Iterieren und Verarbeiten von Datenströmen .quelle
IQueryable
undIEnumerable
, aber ich verstehe den Anwendungsfall für dieAsQueryable
Erweiterungsmethode nicht. Ich bin jedoch ein bisschen über diesen Satz gestolpert, von dem ich vermute, dass er die Antwort hat, nach der ich suche (basierend auf den positiven Stimmen).AsQueryable()
?" Wenn ich beginne mit einem IEnumerable (etwas schon der Lage ist, eine Aufzählung Fähigkeit), warum sollte ich zu konvertieren mußIQueryable
die Erweiterungsmethode verwendenAsQueryable()
? Vielleicht ein kleines Codebeispiel, um zu veranschaulichen, wo dies nützlich wäre? Mir scheint etwas in Ihrer Erklärung zu fehlen. Vielen Dank für Ihre Zeit.linq to sql
,linq to xml
und so ... Wenn Sie einenlinq
Treiber schreiben möchten , der auf Ihre Datenstrukturen (linq to your data
) abzielt , damit Benutzer Ihrer API die Möglichkeit haben,linq
Abfragen für Ihre Datenstrukturen auszuführen , müssen Sie wählenIQueryable
IQueryable
und zu erklärenIEnumerable
. Ich kenne den Unterschied und das ist nicht das, wonach ich frage. Ich frage, warum jemand etwas nehmen möchte, das implementiert wirdIEnumerable
, und esIQueryable
mithilfe derAsQueryable
Erweiterungsmethode in eine konvertieren möchte . Beantworten Sie das? Ich kann es immer noch nicht sagen ..