问题
I want to run dynamic linq with a string where clause like this:
query = db.Customers.Where("Categories.Any(Code == 'Retail')");
Customer entity has collection of categories
class Customer
{
public List<Category> Categories {get;set;}
...
}
class Category
{
public Guid Id {get;set;}
public string Code {get;set;}
}
Can anyone please tell me is it possible to do something like this?
PS: I need where clause be string. The where clause will be generated at runtime, for this reason I can't use Linq query expression.
I'm using Telerik DataAccess.
回答1:
It's possible as soon as you follow the Expression Language rules.
For instance, string literals must be enclosed in double quotes:
query = db.Customers.Where("Categories.Any(Code == \"Retail\")");
回答2:
You can build your own runtime Expression
:
Expression<Func<Customer, bool>> myRuntimeExpression = null;
if(condition1)
{
myRuntimeExpression = cust => cust.Categories.Any(cat => cat.Code == "Retial"); // or some local variable
}
else if(condition2)
{
myRuntimeExpression = cust => cust.Categories.Any(cat => cat.Id = someId) == false;
}
else if(condition3)
{
}
var query = DB.Customers.Where(myRuntimeExpression);
However, if you need to build more complex queries have a look at Dynamic Queries in Linq Using Expressions.
回答3:
Shouldn't it be like below?
refinedCustomerList = db.Customers.Where(customer => customer.Categories.Any(Code == 'Retail'));
The above list will contain all the customers whose category is 'Retail'
回答4:
You need something like this :
query = db.Customers.Where(x => x.Categories.Where(y => y.Code == "Retail").Any());
回答5:
The linq extention method were accepted an argument of type System.Func<TSource, Int32, Boolean>
- In your case a
Func
that recieves aCustomer
as an argument and returns true / false.
The result of the Where function would be all theCustomers
that theFunc
returnedtrue
for.
"Categories.Any(Code == 'Retail')"
is a string, not a Func
, thus cannot be passed as an argument to the Where
method.
Perhaps what you are looking for, if you want to keep the query flexible is some thing like:
Public Customer[] QueryCustomers(Func<Customer,bool> predicate)
{
var result = db.Customers.Where(c=> predicate(c)).ToArray();
return result;
}
Usage:
var retailCustomers =
QueryCustomers(customer => customer.Categories.Any(Code == 'Retail'))
Or any other query you might compose in run/compile time:
var customersWithNoCategories =
QueryCustomers(customer => customer.Categories.Count == 0)
来源:https://stackoverflow.com/questions/37740409/c-sharp-dynamiclinq-where-clause-with-any