【问题标题】:How to delegate parts of a where clause to a different area如何将 where 子句的部分委托给不同的区域
【发布时间】:2011-09-13 19:36:43
【问题描述】:

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

我正在使用实体框架并且有一个带有布尔值的对象?财产。我开始围绕这个特定属性写很多 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;

我尝试向 Foo 类添加诸如 'Expression '、'Func ' 和 'bool' 等类型的属性和方法,但 Linq 似乎不喜欢它们.

非常感谢任何指针。

谢谢

【问题讨论】:

    标签: linq entity-framework


    【解决方案1】:

    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;
    

    【讨论】:

    • 感谢 Slauma,这适用于这种情况。但是因为这会返回一个 IQueryable(而不是 ObjectQuery),所以我不能使用其他的扩展,比如 Include。
    • @Andy:您必须在扩展方法调用之前指定Include:from f in FooList.Include("Bars").WhereIsNot()...。当您使用普通的Where 方法时,您还需要它,因为Where 只返回一个IQueryable。
    • 您始终可以将 IQueryable 转换回 ObjectQuery,或者您可以安装 EF 4.1 并在 IQueryable 上使用其 Include 版本(并在内部进行该转换)。
    • @Slauma,是的,你是对的,当我看到那个时,我有点慢。我有点惊讶,虽然它看起来不像是一种让它在查询中工作的方法 - 也许我期待它做一些它从未设计过的事情。
    【解决方案2】:

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

    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;
    

    【讨论】:

    • 我不确定 EF LINQ 提供程序是否知道如何处理 IsNot()。
    • 这实际上是我尝试的第一件事,我也尝试过添加与非扩展静态方法、普通方法和属性相同的内容,每次都得到类似的结果:“LINQ to Entities 无法识别方法 'Boolean IsNot(FooNamespace.Foo)' 方法,并且此方法无法转换为存储表达式。"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多