Search code examples
c#.netlinqlinq-to-entities

C# - code to order by a property using the property name as a string


What's the simplest way to code against a property in C# when I have the property name as a string? For example, I want to allow the user to order some search results by a property of their choice (using LINQ). They will choose the "order by" property in the UI - as a string value of course. Is there a way to use that string directly as a property of the linq query, without having to use conditional logic (if/else, switch) to map the strings to properties. Reflection?

Logically, this is what I'd like to do:

query = query.OrderBy(x => x."ProductId");

Update: I did not originally specify that I'm using Linq to Entities - it appears that reflection (at least the GetProperty, GetValue approach) does not translate to L2E.


Solution

  • I would offer this alternative to what everyone else has posted.

    System.Reflection.PropertyInfo prop = typeof(YourType).GetProperty("PropertyName");
    
    query = query.OrderBy(x => prop.GetValue(x, null));
    

    This avoids repeated calls to the reflection API for obtaining the property. Now the only repeated call is obtaining the value.

    However

    I would advocate using a PropertyDescriptor instead, as this will allow for custom TypeDescriptors to be assigned to your type, making it possible to have lightweight operations for retrieving properties and values. In the absence of a custom descriptor it will fall back to reflection anyhow.

    PropertyDescriptor prop = TypeDescriptor.GetProperties(typeof(YourType)).Find("PropertyName");
    
    query = query.OrderBy(x => prop.GetValue(x));
    

    As for speeding it up, check out Marc Gravel's HyperDescriptor project on CodeProject. I've used this with great success; it's a life saver for high-performance data binding and dynamic property operations on business objects.