C# DynamicLinq where 子句与 Any()
C# DynamicLinq where clause with Any()
我想 运行 动态 linq 带有这样的字符串 where 子句:
query = db.Customers.Where("Categories.Any(Code == 'Retail')");
客户实体有类别集合
class Customer
{
public List<Category> Categories {get;set;}
...
}
class Category
{
public Guid Id {get;set;}
public string Code {get;set;}
}
任何人都可以告诉我是否可以做这样的事情?
PS: 我需要 where 子句是字符串。 where 子句将在 运行 时生成,因此我不能使用 Linq 查询表达式。
我正在使用 Telerik DataAccess。
不应该像下面这样吗?
refinedCustomerList = db.Customers.Where(customer => customer.Categories.Any(Code == 'Retail'));
以上列表将包含类别为 'Retail'
的所有客户
你需要这样的东西:
query = db.Customers.Where(x => x.Categories.Where(y => y.Code == "Retail").Any());
您可以构建自己的运行时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);
但是,如果您需要构建更复杂的查询,请查看 Dynamic Queries in Linq Using Expressions。
linq extention method were 接受了 System.Func<TSource, Int32, Boolean>
类型的参数
- 在你的例子中,一个
Func
接收一个 Customer
作为参数,returns true / false。
Where 函数的结果将是 Func
返回 true
的所有 Customers
。
"Categories.Any(Code == 'Retail')"
是一个字符串,而不是 Func
,因此不能作为参数传递给 Where
方法。
如果您想保持查询的灵活性,也许您正在寻找的是:
Public Customer[] QueryCustomers(Func<Customer,bool> predicate)
{
var result = db.Customers.Where(c=> predicate(c)).ToArray();
return result;
}
用法:
var retailCustomers =
QueryCustomers(customer => customer.Categories.Any(Code == 'Retail'))
或您可能在 run/compile 时间内提出的任何其他查询:
var customersWithNoCategories =
QueryCustomers(customer => customer.Categories.Count == 0)
只要您遵守 Expression Language 规则,就有可能。
例如,字符串文字必须用双引号引起来:
query = db.Customers.Where("Categories.Any(Code == \"Retail\")");
我想 运行 动态 linq 带有这样的字符串 where 子句:
query = db.Customers.Where("Categories.Any(Code == 'Retail')");
客户实体有类别集合
class Customer
{
public List<Category> Categories {get;set;}
...
}
class Category
{
public Guid Id {get;set;}
public string Code {get;set;}
}
任何人都可以告诉我是否可以做这样的事情?
PS: 我需要 where 子句是字符串。 where 子句将在 运行 时生成,因此我不能使用 Linq 查询表达式。
我正在使用 Telerik DataAccess。
不应该像下面这样吗?
refinedCustomerList = db.Customers.Where(customer => customer.Categories.Any(Code == 'Retail'));
以上列表将包含类别为 'Retail'
的所有客户你需要这样的东西:
query = db.Customers.Where(x => x.Categories.Where(y => y.Code == "Retail").Any());
您可以构建自己的运行时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);
但是,如果您需要构建更复杂的查询,请查看 Dynamic Queries in Linq Using Expressions。
linq extention method were 接受了 System.Func<TSource, Int32, Boolean>
类型的参数
- 在你的例子中,一个
Func
接收一个Customer
作为参数,returns true / false。
Where 函数的结果将是Func
返回true
的所有Customers
。
"Categories.Any(Code == 'Retail')"
是一个字符串,而不是 Func
,因此不能作为参数传递给 Where
方法。
如果您想保持查询的灵活性,也许您正在寻找的是:
Public Customer[] QueryCustomers(Func<Customer,bool> predicate)
{
var result = db.Customers.Where(c=> predicate(c)).ToArray();
return result;
}
用法:
var retailCustomers =
QueryCustomers(customer => customer.Categories.Any(Code == 'Retail'))
或您可能在 run/compile 时间内提出的任何其他查询:
var customersWithNoCategories =
QueryCustomers(customer => customer.Categories.Count == 0)
只要您遵守 Expression Language 规则,就有可能。
例如,字符串文字必须用双引号引起来:
query = db.Customers.Where("Categories.Any(Code == \"Retail\")");