【发布时间】:2020-12-19 18:43:34
【问题描述】:
所以我有一个类来处理字符串,将它们拆分并设置整个表达式(不仅仅是 contriesNames,但我在这里不介绍它以使其更简单):
public class DealWithExpression
{
public void DealWithExpression(Params params)
{
string[] countriesNames = {};
if(params.Countries != null)
countriesNames = params.Countries.Split(','); // params got Countries string prop.
HandleQuery(someQuery, x => countriesNames.Contains(db.table.Name))
}
}
我还有另一个类从数据库中获取查询并且应该使用预期的Filter 表达式进行过滤:
public class DealWithQuery()
{
HandleQuery(IQueryable<TEntity> inputQuery, Expression<Func<T, bool>> Filter)
{
var query = inputQuery;
if(Filter != null)
{
query.Where(Filter);
}
}
}
我认为我存储在 Filter 对象中的表达式不存储 string[] countriesNames 并且它不知道要比较什么,但我不确定。我不想在 DealWithQuery 类中存储额外的字符串数组,有没有办法做到这一点?避免课堂混乱?
【问题讨论】:
-
您可以通过声明一个接收字符串列表(您的过滤器)的函数的函数来实现此目的。现在您有了一个函数,其中包含一个列表,您可以从 LINQ 语句中调用它。这些函数类似于“高阶函数”,请参见下面的示例:
Func<List<string>, Func<string, bool>> filter = list => str => list.Contains(str); var queryParameters = new List<string>() {"Nike", "Sweden", "Large"}; var countries = new List<string>() {"Germany", "Sweden", "Denmark"}; var countryFilter = filter(countries); var filteredList = queryParameters.Where(countryFilter); -
无耻插件:我写了一个VS debugging visualizer,可以让你检查表达式树的结构;将其指向
someQuery.Expression,您将能够看到用于生成查询的表达式,包括任何封闭变量。另外,如果countriesNames为空,我猜查询不会返回任何结果,因为countriesNames不包含任何值;这可能是也可能不是所需的行为。
标签: c# .net linq lambda where-clause