Linq 如何将where子句的部分委托给不同的区域

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

我目前试图解决的特殊情况涉及一个bool?在数据库中引用可为空的位字段。但这种逻辑应该适用于许多不同的情况

我正在使用实体框架,并且有一个带有bool的对象?财产。我开始写很多关于这个特定属性的Linq,但是因为当bool=如果写的是true,我发现我写的查询如下所示:

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>”、“Func”和“bool”等类型的属性和方法,但Linq似乎不喜欢它们

非常感谢您的指点


谢谢

我想您可以编写一个简单的扩展方法

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;