I have a generic method in which I want to sort an IQueryable<T>
by its key field (it is safe to assume there is only one). Thus:
void DoStuff<T>(...)
{
IQueryable<T> queryable = ... // given
PropertyInfo keyField = ... // given
var sortedQueryable = queryable.OrderBy(<some expression here>);
...
}
How do I define an Expression
that will return the keyField
property of T
so that this will work?
I like to use an interface IBaseEntity that has an Id property of type T. That would make your query:
Extension Method:
Each entity would implement IBaseEntity and have something like
Then in the context
Note: This requires some setup in the context and entities. The database can have whatever keys you want, you're mapping them individually to the property Id in the OnModelCreating method of the context.
This isn't too difficult, but you need to invoke the
OrderBy
with reflection as you don't know the type of the key field ahead of time. So given the code you already show, you would do something like this:Same idea as in DavidG answer but different approach