2010-07-23 11 views
5

Ich habe versucht, dynamische LINQ zu Entity in meiner Anwendung für die Angabe des Attributs OrderBy zur Laufzeit verwenden. Allerdings, wenn Sie den Code unter Verwendung des in der Mehrzahl der Dokumentation beschrieben:OrderBy ("it." + Sort) - Harte Codierung in LINQ to Entity Framework?

var query = context.Customer.OrderBy("Name"); 

erhielt ich die folgende Ausnahme:

System.Data.EntitySqlException: ‚Namen‘ konnte nicht in dem aktuellen Bereich oder Kontext gelöst werden . Stellen Sie sicher, dass alle referenzierten Variablen im Gültigkeitsbereich sind, dass erforderliche Schemas geladen sind und dass Namespaces korrekt referenziert werden.

Nach langem Suchen fand ich diese MSDN-Seite:

http://msdn.microsoft.com/en-us/library/bb358828.aspx

Welche das folgende Codebeispiel enthalten:

ObjectQuery<Product> productQuery2 = productQuery1.OrderBy("it.ProductID"); 

Dies veranlasste mich mein Code wie folgt zu ändern:

var query = context.Customer.OrderBy("it.Name"); 

Danach funktioniert der Code einwandfrei. Kann jemand bestätigen, dass dies in der Tat der richtige Weg ist, OrderBy mit LINQ to Entity zu arbeiten? Ich kann nicht glauben, dass der Rahmen auf diese Weise umgesetzt worden wäre, vielleicht habe ich etwas übersehen?

Danke, Matt

Antwort

7

Die it.Name Syntax ist ESQL und ist in der Tat spezifisch für die EF. Es gibt gute Gründe, dies manchmal zu verwenden (z. B. Kollationsspezifizierer), aber das ist nicht das, was ich normalerweise tue.

Normalerweise verwende ich Standard Ausdrücke LINQ:

var query = context.Customer.OrderBy(p => p.Name); 

Sie können auch System.Linq.Dynamic verwenden, wenn Sie es von Code Gallery herunterzuladen, und dann Ihre ursprüngliche Abfrage:

var query = context.Customer.OrderBy("Name"); 

. ..wird funktionieren.

+0

Danke, ich werde versuchen, die dynamische lib und sehen, ob das funktioniert. Wären Sie in der Lage, ein Beispiel zu geben, wenn es vorzuziehen wäre, die "it" -Syntax zu verwenden? Es scheint Ihren Code eng mit einer Implementierung zu koppeln, über die Sie keine Kontrolle haben. I.e. Es könnte sich ändern und somit Ihren Code brechen? Danke, Matt – Matt

+0

IMHO, der einzige gute Grund, ESQL über System.Linq.Dynamic zu verwenden, ist, wenn Sie eine der wenigen Funktionen in ESQL verwenden müssen, die in S.L.D. nicht verfügbar sind, wie Kollatierungen. Meistens bevorzuge ich S.L.D. –

1

Kein schöner Weg, so weit

auf diese Frage Meine Antwort war eine gespeicherte Prozedur zu erstellen, die Parameter Sortierung zu steuern hat.

Verwandte Themen