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\")");