C# 我在表达式中检查的数组值是否存储在表达式中<;Func<;T、 布尔>>;?
因此,我有一个处理字符串的类,将字符串拆分并设置整个表达式(这里不只是contriesNames,但我在这里介绍它并不是为了让它更简单): 我还有另一个类,它从数据库中获取查询,应该使用预期的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) {
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"