我看到了这行代码:
var myFilter= val1 ? (Func<Person, bool>)(person=> true) : (person=> person.IsValid);
这部分是什么意思?:
(Func<Person, bool>)(person=> true)
然后,myFilter
变量用于过滤表格中的某些数据......
return ctx.Persons.Where(myFilter).ToList();
当val1
为真并且选择条件(Func<Person, bool>)(person=> true)
的第一部分时会发生什么?
答案 0 :(得分:4)
Where
方法采用Func<T, bool>
类型的参数 - 这实际上是一个函数,它将T
(在本例中为Person
)作为参数,并且返回bool
。 Where
方法为源列表中的每个对象评估此函数,并仅筛选导致true
的对象。
委托person => true
定义了一个方法,该方法将Person
作为参数,始终返回true,而不管Person
个对象。在Where
子句中使用时,它将永远不会过滤掉任何内容并返回原始项集。 (由于Func<T, bool>
的使用,需要转换为var
- 编译器无法在没有提示的情况下确定匿名委托的类型。)
所以这段代码:
var myFilter = val1 ? (Func<Person, bool>)(person => true) : (person => person.IsValid);
return ctx.Persons.Where(myFilter).ToList();
做同样的事情:
if (val1)
{
return ctx.Persons.ToList();
}
else
{
return ctx.Persons.Where(person => person.IsValid).ToList();
}
答案 1 :(得分:2)
在这种情况下,传递给Where
的表达式始终会返回true
- 对于传递给它的任何Person
。
答案 2 :(得分:2)
对于要编译的条件运算符,这两个表达式需要具有相同的类型。 Lambdas有独特的类型,因此两个lambdas不具有相同的类型。通过将这些lambda中的一个(至少)转换为Func<Person, bool>
,可以通过将另一个lambda隐式转换为Func类型来确定两个表达式的公共类型为Func<Person, bool>
。
所以myFilter
现在要么总是返回true,要么val1
为假,当用作Where子句时实际上会进行一些过滤。