Linq 如何将where子句的部分委托给不同的区域
我目前试图解决的特殊情况涉及一个bool?在数据库中引用可为空的位字段。但这种逻辑应该适用于许多不同的情况 我正在使用实体框架,并且有一个带有bool的对象?财产。我开始写很多关于这个特定属性的Linq,但是因为当bool=如果写的是true,我发现我写的查询如下所示:Linq 如何将where子句的部分委托给不同的区域,linq,entity-framework,Linq,Entity Framework,我目前试图解决的特殊情况涉及一个bool?在数据库中引用可为空的位字段。但这种逻辑应该适用于许多不同的情况 我正在使用实体框架,并且有一个带有bool的对象?财产。我开始写很多关于这个特定属性的Linq,但是因为当bool=如果写的是true,我发现我写的查询如下所示: var Result = from f in FooList where f.NullableBool == false || f.NullableBool == null w
var Result = from f in FooList
where f.NullableBool == false || f.NullableBool == null
where f.Bar.Contains(SearchTerm)
select f;
这不是一个大问题,但我真的希望能够将“x.NullableBool==false | | x.NullableBool==false”移到另一个位置,并调用如下内容:
var Result = from f in FooList
where f.IsNot && f.Bar.Contains(SearchTerm)
select f;
我尝试过向Foo类中添加诸如“Expression谢谢我想您可以编写一个简单的扩展方法
public static bool IsNot (this Foo f)
{
return f.NullableBool == false || f.NullableBool == false;
}
像这样使用它
var Result = from f in FooList
where f.IsNot() && f.Bar.Contains(SearchTerm)
select f;
IQueryable
的扩展方法应该可以工作:
public static class QueryExtensions
{
public static IQueryable<Foo> WhereIsNot(this IQueryable<Foo> query)
{
return query.Where(f =>
f.NullableBool == false || f.NullableBool == false);
}
}
我不确定EF LINQ提供程序是否知道如何处理
IsNot()
。这实际上是我尝试的第一件事,我还尝试添加与非扩展静态方法、普通方法和属性相同的内容,每次都会得到类似的结果:“LINQ to Entities不识别方法'Boolean IsNot(FooNamespace.Foo)”'方法,而此方法无法转换为存储表达式。'谢谢Slauma,这将适用于这种情况。但是,因为这会返回一个IQueryable(而不是ObjectQuery),所以我不能使用其他扩展,比如Include。@Andy:在扩展方法调用之前,必须指定Include
:来自愚人节中的f的。Include(“条”)。WhereIsNot()
。当您使用普通的Where
方法时,您也需要它,因为Where
只返回一个IQueryable
。您可以始终将IQueryable
转换回ObjectQuery
,或者您可以安装EF4.1并使用其Include
版本处理IQueryable
(并在内部进行转换)。@Slauma,是的,你是对的,当我看到这一点时,我有点慢。我有点惊讶,似乎没有一种方法可以在查询中实现这一点——也许我希望它能做一些它从未设计过的事情。
var result = from f in FooList.WhereIsNot()
where f.Bar.Contains(SearchTerm)
select f;