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

时间:2011-09-13 19:36:43

标签: linq entity-framework

我目前正在努力解决的特殊情况涉及一个布尔?引用数据库中的可空位字段。但逻辑应该适用于许多不同的情况。

我正在使用Entity Framework并且有一个bool对象?属性。我开始在这个特定属性周围编写很多Linq,但是因为Sql在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;

我尝试添加类型的属性和方法,例如'Expression< Func< Foo,bool> >','Func< Foo,bool>'和'bool'到Foo类,但Linq似乎不喜欢它们。

任何指针都非常感激。

由于

2 个答案:

答案 0 :(得分:2)

IQueryable的扩展方法应该有效:

public static class QueryExtensions
{
    public static IQueryable<Foo> WhereIsNot(this IQueryable<Foo> query)
    {
        return query.Where(f => 
            f.NullableBool == false || f.NullableBool == false);
    }
}

然后你可以这样使用它:

var result = from f in FooList.WhereIsNot()
             where f.Bar.Contains(SearchTerm)
             select f;

答案 1 :(得分:0)

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

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;