【问题标题】:Can I use custom delegate method in Where method of Entity Framework?我可以在实体框架的 Where 方法中使用自定义委托方法吗?
【发布时间】:2010-09-24 03:21:55
【问题描述】:
Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);

我将参数传递给 Where 方法如下:f =&gt; f.Id &gt; 4。 我可以传递一个委托方法而不是f.Id &gt; 4吗?

【问题讨论】:

    标签: c# .net entity-framework delegates


    【解决方案1】:

    没有。

    实体框架需要能够查看正在尝试的所有内容。

    所以如果你只是做了这样的事情:

    queryable.Where(f => DelegateFunc(f));
    

    DelegateFunc 的定义如下所示:

    public bool DelegateFunc(Foo foo)
    {
       return foo.Id > 4;
    }
    

    实体框架无法窥视委托内部,将其打开并将其转换为 SQL。

    但一切都没有丢失。

    如果您的目标是重复使用常见的过滤器等,您可以这样做:

    public Expression<Func<Foo, bool>> DelegateExpression{
       get{
           Expression<Func<Foo,bool>> expr = f => f.Id > 4;
           return expr;
       }
    }
    
    queryable.Where(DelegateExpression);
    

    【讨论】:

    • 你错了,亚历克斯。我传递给 Where 方法如下:“queryable.Where(f => DelegateFunc);”而不是“queryable.Where(f => DelegateFunc(f));”。该语句成功执行,但返回一个 Enumerable not Queryable。
    • 我不同意。通常在执行过滤器时,您希望将其转换为 SQL。获取 IEnumerable 证明您没有在数据库中执行过滤器,而是 LINQ 到它接管的对象,并且您正在检索数据库中的每条记录并在内存中进行过滤。在测试中可能工作得很好,但是一旦你有很多数据,它就会表现得很糟糕。本质上,您仅使用 EF 来实现实体,这是一种反模式。
    • 你的评论很有用,亚历克斯。它以我的方式显示了性能的缺陷。我将不传递委托方法,而是传递由方法返回的 Expression>。在那种方法中,我可以自定义条件。
    • Alex,你为什么知道 LINQ 会获取数据库中的每条记录并在内存中进行过滤?您在哪里阅读文章、博客或文档?
    • 我曾在 Microsoft 的实体框架产品团队工作。但更重要的是,如果您没有将查询作为表达式,则无法将其转换为 SQL。这就是发明 LINQ 和表达式的原因。哦,顺便说一句,我认为我应该在这里接受!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多