Given a Parent and a valid columnName, I want to find all the related Children, ordered by a dynamic column name. Here’s how I thought my code would look:
Parent. // EntityObject
Children. // EntityCollection
Where(c => c.Gender == 'm'). // IEnumerable
OrderBy(columnName, ListSortDirection.Ascending). // -- not available --
Skip(pages * pageSize).Take(pageSize);
IEnumerable.OrderBy(string columnName) doesn’t exist. Looking around to accomplish the “sort by dynamic column name”, I started with this excellent-looking solution: How do I create an expression tree for run time sorting? , but this operates on an IQueryable
If it did, I assume it would bring the records over the wire to sort and diminish the performance of my pager anyway. So I reordered:
Repository. // Repository
Children. // ObjectSet
Where(c => c.Parent == Parent && c.Gender == 'm'). // ObjectQuery, runtime error
OrderBy(columnName, ListSortDirection.Ascending). // IOrderedQueryable
Skip(pages * pageSize).Take(pageSize);
ObjectSet and ObjectQuery implement OrderBy(string columnName), and this code compiles, but yields the error:
Unable to create a constant value of type ‘DataModel.Parent’. Only
primitive types (‘such as Int32, String, and Guid’) are supported in
this context.
Of course, I can get the parent ID, but the Child.ParentReference is also a non-primitive type.
I can think of a few ways that would result in loading the entire recordset across the wire, but I feel like I must be missing something, because it must not be so hard to get a set of basic directive through to the database using all MS-centric technologies.
edit: pretend I’m http://en.wikipedia.org/wiki/Quiverfull , and need to paginate my children. 🙂
edit2: clarified my need to query a dynamic column name.
So there were a couple issues I was having, both mentioned in the question title.
Sorting by a run-time-selected, or dynamic, column name required some expression building. I used @Slace’s popular extension method here.
That required an IQueryable. IQueryable works for me, because every time I was accidentally transforming my query into an enumerable, I was of course bringing all the results back over the wire before paging, which I was trying to avoid. But I still needed a way to get an IQueryable for results with a relationship to an entity I already held.
It was something simple I overlooked, just joining on the Entity.Id worked, and didn’t result in redundant joins at the datasource. Not quite as object-oriented as I expected from EF, but it will do.