Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

OrderBy("it." + sort) -- Hard coding in LINQ to Entity framework?

I have been trying to use dynamic LINQ to Entity in my application for specifying the OrderBy attribute at runtime. However when using the code as described in the majority of documentation:

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

I received the following exception:

System.Data.EntitySqlException: 'Name' could not be resolved in the current scope or context. Make sure that all referenced variables are in scope, that required schemas are loaded, and that namespaces are referenced correctly.

After much searching I found this MSDN page:

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

Which included the following code example:

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

This prompted me to change my code to the following:

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

After this the code works perfectly. Would anyone be able to confirm that this is indeed the correct way to get OrderBy working with LINQ to Entity? I can’t believe that the framework would have been implemented in this way, perhaps I have overlooked something?

Thanks, Matt

like image 354
Matt Avatar asked Jul 23 '10 16:07

Matt


2 Answers

The it.Name syntax is ESQL and is indeed specific to the EF. There are good reasons to use this sometimes (e.g., collation specifiers), but it's not what I normally do.

Usually I use standard LINQ expressions:

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

You can also use System.Linq.Dynamic, if you download it from Code Gallery, and then your original query:

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

...will work.

like image 80
Craig Stuntz Avatar answered Sep 20 '22 23:09

Craig Stuntz


No nice way, so far

My answer to this question was to create a stored procedure which has parameter to control sorting.

like image 35
st78 Avatar answered Sep 21 '22 23:09

st78