2010-07-23 12 views
5

J'ai essayé d'utiliser LINQ dynamique à Entity dans mon application pour spécifier l'attribut OrderBy à l'exécution. Cependant lorsque vous utilisez le code comme décrit dans la majorité des documents:OrderBy ("it." + Tri) - Codage dur dans le framework LINQ to Entity?

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

J'ai reçu l'exception suivante:

System.Data.EntitySqlException: « Nom » ne pouvait pas être résolue dans le cadre ou le contexte actuel . Assurez-vous que toutes les variables référencées sont dans la portée, que les schémas requis sont chargés et que les espaces de noms sont correctement référencés.

Après de longues recherches, j'ai trouvé cette page MSDN:

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

MARQUÉE l'exemple de code suivant:

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

Cela m'a incité à changer mon code à ce qui suit:

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

Après cela, le code fonctionne parfaitement. Quelqu'un pourrait-il confirmer que c'est effectivement la bonne façon de faire fonctionner OrderBy avec LINQ to Entity? Je ne peux pas croire que le cadre aurait été mis en œuvre de cette façon, peut-être que j'ai oublié quelque chose?

Merci, Matt

Répondre

7

La syntaxe it.Name est ESQL et est en effet spécifique à l'EF. Il y a de bonnes raisons de l'utiliser parfois (par exemple, des spécificateurs de collation), mais ce n'est pas ce que je fais normalement.

Habituellement j'utilise des expressions standards LINQ:

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

Vous pouvez également utiliser System.Linq.Dynamic, si vous le téléchargez du Code Gallery, puis votre requête initiale:

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

. ..marchera.

+0

Merci, je vais essayer la lib dynamique et voir si cela fonctionne. Seriez-vous capable de donner un exemple quand il serait préférable d'utiliser la syntaxe 'it'? Il semble coupler étroitement votre code avec une implémentation sur laquelle vous n'avez aucun contrôle. C'est à dire. cela pourrait changer et donc casser votre code? Merci, Matt – Matt

+0

À mon humble avis, la seule bonne raison d'utiliser ESQL sur System.Linq.Dynamic est si vous avez besoin d'utiliser l'une des rares fonctionnalités d'ESQL qui ne sont pas disponibles dans S.L.D., comme les classements. Surtout je préfère S.L.D. –

1

Pas belle façon, à ce jour

Ma réponse à cette question était de créer une procédure stockée qui a paramètre pour contrôler le tri.