【问题标题】:Do values of array i check against in expression are stored in Expression<Func<T,bool>>? [duplicate]我在表达式中检查的数组值是否存储在 Expression<Func<T,bool>> 中? [复制]
【发布时间】: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&lt;List&lt;string&gt;, Func&lt;string, bool&gt;&gt; filter = list =&gt; str =&gt; list.Contains(str); var queryParameters = new List&lt;string&gt;() {"Nike", "Sweden", "Large"}; var countries = new List&lt;string&gt;() {"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


【解决方案1】:

它将实际存储集合。您可以像这样简单地检查:

var x = new[] {"a","b"};
Expression<Func<string, bool>> expr = s => x.Contains(s);
Console.WriteLine(expr.Compile()("a")); // prints "True"
Console.WriteLine(expr.Compile()("a1")); // prints "False"

这称为closure。 C# 中的闭包是使用特殊的编译器生成的类来实现的(也适用于匿名函数和表达式树)。你可以自己检查反编译here。或者类似于您的original code

【讨论】:

  • 这很奇怪,因为它根本不过滤我的查询,我用调试器检查并确定我从参数 iam 发送中得到了字符串 [],它将表达式添加到我的过滤器但它没有'当我在查询中添加它时不起作用。Where(过滤器)
  • @PTK 检查首先使用分析器访问数据库的查询。
猜你喜欢
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
相关资源
最近更新 更多