Ich versuche, eine Abfrage zu erstellen, die eine Liste von IDs in der where-Klausel verwendet, wobei ich die Silverlight ADO.Net Data Services-Client-API (und damit Linq To Entities) verwende. Kennt jemand eine Problemumgehung für Contains, die nicht unterstützt wird?
Ich möchte so etwas machen:
List<long?> txnIds = new List<long?>();
// Fill list
var q = from t in svc.OpenTransaction
where txnIds.Contains(t.OpenTransactionId)
select t;
Versuchte dies:
var q = from t in svc.OpenTransaction
where txnIds.Any<long>(tt => tt == t.OpenTransactionId)
select t;
Aber bekam "Die Methode 'Any' wird nicht unterstützt".
c#
linq
entity-framework
.net-3.5
linq-to-entities
James Bloomer
quelle
quelle
Antworten:
Update: EF ≥ 4 unterstützt
Contains
direkt (CheckoutAny
), sodass Sie keine Problemumgehung benötigen.VERWENDUNG:
quelle
if (!collection.Any()) //action;
Aktion "Ersetzen" durch die einfache Rückgabe einer leeren Abfrage des angeforderten Typs, um die beste Leistung zu erzielen - oder entfernen Sie einfach diese Zeile.Sie können auf die Codierung von E-SQL zurückgreifen (beachten Sie das Schlüsselwort "it"):
Hier ist der Code, mit dem ich aus einer Sammlung, YMMV, E-SQL generiert habe:
quelle
Von MSDN :
und die Abfrage wird:
quelle
Ich bin mir bei Silverligth nicht sicher, aber in Linq to Objects verwende ich immer any () für diese Abfragen.
quelle
Um den Datensatz zu vervollständigen, ist hier der Code, den ich schließlich verwendet habe (Fehlerprüfung aus Gründen der Klarheit weggelassen) ...
quelle
Hier ist ein Beispiel, in dem ich demonstriere, wie satzbasierte Abfragen mithilfe des DataServiceContext geschrieben werden: http://blogs.msdn.com/phaniraj/archive/2008/07/17/set-based-operations-in-ado-net-data -services.aspx
quelle
Vielen Dank. Wobei mir die Erweiterungsmethode ausreichte. Ich habe es profiliert und den gleichen SQL-Befehl für die Datenbank wie e-sql generiert.
Generierte dies:
quelle
Ich denke, ein Join in LINQ kann ein Walkaround sein.
Ich habe den Code jedoch nicht getestet. Ich hoffe es hilft. Prost. :-)
Mach mit bei LINQ:
http://weblogs.asp.net/salimfayad/archive/2008/07/09/linq-to-entities-join-queries.aspx
quelle
Sorry neuer Benutzer, ich hätte die eigentliche Antwort kommentiert, aber anscheinend kann ich das noch nicht?
Beachten Sie in Bezug auf die Antwort mit Beispielcode für BuildContainsExpression (), dass, wenn Sie diese Methode für Datenbankentitäten (dh keine speicherinternen Objekte) verwenden und IQueryable verwenden, diese tatsächlich in die Datenbank verschoben werden muss da es im Grunde viele SQL "- oder" Bedingungen ausführt, um die "where in" -Klausel zu überprüfen (führen Sie sie mit SQL Profiler aus, um zu sehen).
Dies kann bedeuten, dass wenn Sie ein IQueryable mit mehreren BuildContainsExpression () verfeinern, es nicht in eine SQL-Anweisung umgewandelt wird, die am Ende wie erwartet ausgeführt wird.
Die Problemumgehung bestand für uns darin, mehrere LINQ-Joins zu verwenden, um einen SQL-Aufruf zu erhalten.
quelle
Neben der ausgewählten Antwort.
Ersetzen Sie
Expression.Or
durchExpression.OrElse
, um es mit Nhibernate zu verwenden, und beheben Sie dieUnable to cast object of type 'NHibernate.Hql.Ast.HqlBitwiseOr' to type 'NHibernate.Hql.Ast.HqlBooleanExpression'
Ausnahme.quelle