I'm looking to use LINQ for some searching routines and wanted to have some dynamic where clauses. So, for example, if a user wants to search by city or search by state, I would have a dynamic LINQ Where<> call instead of creating two strongly typed LINQ expressions and then using the appropriate one based on how the user wants to search.
So I would like to do this:
String criteria="p.City='Pittsburgh'"; //or "p.State='PA'"
personData.Where(criteria)
instead of
personData.Where(p => p.City=="Pittsburgh");
or
personData.Where(p => p.State=="PA");
I came across a blog post by Scott Guthrie talking about Dynamic LINQ in the Visual Studio 2008 samples. This seems to do what I want, but my questions are:
- Is this sample library supported by Microsoft?
- Scott Guthrie's article is in regards to VS2008 (.NET 3.5). Is there a better option for .NET 4? Maybe something that was released with .NET 4 that accomplishes the same thing (or something very close)?
Thanks in advance!
You may want to take a look at PredicateBuilder
It should now be available. I could download it through NuGet: http://www.nuget.org/packages/System.Linq.Dynamic/
I don't think it's "supported" by Microsoft - it seems to be released under a public license, which says in part:
On your second question, I don't think there's a .NET 4 version. The 3.5 should work fine in a 4.0 project, and I don't think there's really much to add in. As I understand it, this was a nifty little library for doing those occasional, one-off string-based linq queries. Maybe you were for some reason manually sorting a grid, and needed to modify your collections sort order based on a string representing the property in question. Voila. I doubt you'll see a lot of effort put into adding a lot of features into this.
This feature would be really nice to have. A similar feature exists in ADO.net Datatables. It would be really helpful for LinqToSql as well. Sure you would lose strongly typed checking, but thats the whole point, you want dynamic searches. If you handle the exceptions properly I really think its a feature worth having.
You might consider adding a feature request to Microsoft Connect. The library already exists maybe they will consider adding official support for it. If you do make a feature request make sure you post a link here so we can vote for it. Microsoft Connect has voting system similar to stackoverflow. I have submitted a few myself LinqtoSql TableUpdate and VB.net Readonly Interfaces like C#.
I remember having some trouble with this library. I think it had something to do with static methods.
I found it better to develop the expressions I needed. This article by Ilya Builuk demonstrates custom expressions. The nice thing about Ilya's framework it removes a lot of the boilerplate code when doing operations like sorting for jqGrid.
I found it extremely helpful when learning about the underlying concepts of expressions.
The nice thing about this code is that it allows you to use dot operators for getters.
Person.Age
or if you want to violate Demeter you can even do multiple getters.The code can be improved upon. I believe I added
StartsWith
and only allowed it for string operations as well as a few other search operations. Regardless its worth a look, it helped me understand linq expressions a lot.WhereOperation enumerator: