I am trying to make a LINQ statement where the where clause comes from a variable. For example:
string whereClause = address.zip == 23456;
var x = from something in someList where whereClause;
Is this possible? I cannot seem to get it to work.
thanks,
Update - my where clause is predefined and will be based on user input so I don't think this will work for me. Basically whereClause is not constructed in the method, it is a parameter of the method which does the LINQ. I didn't explain that well here is a better example:
public void doLnq(string whereClause)
{
var x = from something in someList where whereClause;
dowork(x);
}
Update - Just to sum up some of the suggestions and centralize everything.
I cannot use a switch to generate the where clause because there are way to many possibilities.
The dynamic linq post that a few of you have posted does look promising but i am having trouble related the linq to sql example to my linq to objects problem.
and @sLaks after looking through msdn http://msdn.microsoft.com/en-us/library/bb353734.aspx I am having trouble figuring out where you meant to use AsQueryable
thanks,
You need to assembly an Expression<Func<T, bool>>
and pass it to the Where()
extension method:
Expression<Func<T, bool>> whereClause = a => a.zip == 23456;
var x = frSomeList.Where(whereClause);
EDIT: If you're using LINQ to Objects, remove the word Expression
to create an ordinary delegate.
This:
var query = from something in someList where whereClause;
is shorthand for:
var query = someList.Where(something => whereClause);
Assuming someList
is an IEnumerable<Address>
, Where
refers to the Enumerable.Where Extension Method. This method expects a Func<Address, bool>
which you can define as follows:
Func<Address, bool> whereClause = address => address.Zip == 23456;
var query = someList.Where(whereClause);
As Richard has pointed out, the Dynamic Query Library can be used to build dynamic filter expressions. When using Linq-To-Objects make sure to convert your IEnumerable<T>
to a IQueryable<T>
first. Here is an (incomplete) example:
using System.Linq.Dynamic;
namespace System.Linq.Dynamic
{
public class Example
{
// Assuming some value is assigned to below field somewhere...
private IEnumerable<Address> m_Addresses;
public void FilterByZipCode(string zipCode)
{
var x = m_Addresses.AsQueryable().Where("Zip == @0", zipCode);
dowork(x);
}
}
public class Address
{
public String Zip { get; set; }
// More Properties...
}
}
That's a built-in Feature of LINQ. Just use the Where extension method.
See LINQ Query Syntax versus Method Syntax (C#) for more information.