I’m writing a custom web app (an administrative utility) that queries a SQL Server database table, and I am giving users the ability to apply their own (limited) custom sorts and filters on the returned information. The sending page allows them to choose up to 3 sort criteria (e.g. Sort 1 then Sort 2 then Sort 3) using drop-down lists on an HTML form. They must also indicate a single letter of the alphabet (through the URL), and the application must return a list of data where field “Sort1” starts with the letter (the filtering is ALWAYS by the Sort1 field).
So for example, they could choose to return a list of all customers whose City starts with the letter “R”, sorted by City then State then Name. Or, they could return all customers whose Name starts with “F”, sorted by Name then Address then Customer ID.
I totally understand how to do this with fixed (known) fields/properties;
var _data = _data.Where(d => d.Name.StartsWith(letter)).OrderBy(p => p.Name).ThenBy(p => p.Address).ThenBy(p => p.CustomerID);
etc. But in my case, the table properties (fields) to be sorted/filtered are not explicitly known; they are only available to my app as strings. What I’d like to be able to do is…
var _data = _data.Where(d => d.["Sort1"].StartsWith(letter)).OrderBy(p => p.["Sort1"]).ThenBy(p => p.["Sort2"]).ThenBy(p => p.["Sort3"]);
where Sort1, Sort2 and Sort3 are posted form field values, but I know this doesn’t work. How can I implement this? I’m using ASP.Net MVC 3 in C#, with LINQ using the Entity Framework (EDM).
What about this approach:
Where
GetPropertyis implemented as: