C# 我在表达式中检查的数组值是否存储在表达式中<;Func<;T、 布尔>>;?

C# 我在表达式中检查的数组值是否存储在表达式中<;Func<;T、 布尔>>;?,c#,.net,linq,lambda,where-clause,C#,.net,Linq,Lambda,Where Clause,因此,我有一个处理字符串的类,将字符串拆分并设置整个表达式(这里不只是contriesNames,但我在这里介绍它并不是为了让它更简单): 我还有另一个类,它从数据库中获取查询,应该使用预期的filter表达式进行过滤: public class DealWithQuery() { HandleQuery(IQueryable<TEntity> inputQuery, Expression<Func<T, bool>> Filter) {

因此,我有一个处理字符串的类,将字符串拆分并设置整个表达式(这里不只是contriesNames,但我在这里介绍它并不是为了让它更简单):

我还有另一个类,它从数据库中获取查询,应该使用预期的
filter
表达式进行过滤:

public class DealWithQuery()
{
     HandleQuery(IQueryable<TEntity> inputQuery, Expression<Func<T, bool>> Filter)
     {
          var query = inputQuery;

           if(Filter != null)
           {
               query.Where(Filter);
           }
     }
}
public类DealWithQuery()
{
HandleQuery(IQueryable inputQuery、表达式筛选器)
{
var query=inputQuery;
if(过滤器!=null)
{
查询.Where(过滤器);
}
}
}

我认为我存储在
Filter
对象中的表达式没有存储
字符串[]countriesNames
,它不知道比较什么,但我不确定。我不想在DealWithQuery类中存储额外的字符串数组,有办法吗?为了避免类混乱?

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

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"
var x=new[]{“a”,“b”};
表达式expr=s=>x.Contains(s);
Console.WriteLine(expr.Compile()(“a”);//打印“真实”
Console.WriteLine(expr.Compile()(“a1”);//打印“假”

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

这很奇怪,因为它根本不过滤我的查询。我使用调试器进行了检查,确保我从params iam sending获得了字符串[],它将表达式添加到我的过滤器中,但当iam将其添加到查询中时,它不起作用。其中(过滤器)@PTK首先使用探查器检查命中db的查询。您可以通过声明一个函数来实现这一点,该函数包含一个字符串列表(您的过滤器)。现在您有了一个函数,其中包含一个列表,您可以从LINQ语句调用该函数。这些函数类似于“高阶函数”,请参见下面的示例:
Func filter=list=>str=>list.Contains(str);var queryParameters=新列表(){“Nike”、“Sweden”、“Large”};var国家=新名单({“德国”、“瑞典”、“丹麦”});var countryFilter=过滤器(国家);var filteredList=queryParameters.Where(countryFilter)Shamless插件:我已经编写了一个允许您检查表达式树结构的插件;将它指向
someQuery.Expression
,您将能够看到用于生成查询的表达式,包括任何闭合变量。另外,如果
countriesNames
为空,我猜查询不会返回任何结果,因为
countriesNames
不包含任何值;这可能是也可能不是期望的行为。
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"