【问题标题】:Entity Framework - Why does this Linq query generate multiple round trips?实体框架 - 为什么此 Linq 查询会生成多个往返行程?
【发布时间】:2013-10-27 15:03:59
【问题描述】:

我有 3 个表:ProductCategoryProductCategory,其中 ProductCategoryProductCategory 之间的多对多关系的连接表。以下 Linq 查询(它是 Category 类中的扩展方法)导致当前 Category 内的每个 ProductCategory 记录的往返。为什么是这样?如何改进?另请注意,这是数据库优先的 EF。

    public IEnumerable<Product> ActiveProducts
    {
        get
        {
            return this.ProductCategories.Where(c => !c.Product.IsDeleted && c.Product.IsActive).OrderBy(c => c.SortOrder).Select(c => c.Product);
        }
    }

【问题讨论】:

    标签: c# linq linq-to-entities query-optimization


    【解决方案1】:

    导航属性不是IQueryable,唉。这就是您获得 LINQ-to-Objects 查询的原因。

    【讨论】:

    • 明白了,但我该如何将其缩减为单次往返?
    • 您需要访问 ObjectContext 以便您可以构建一个包含所有内容的普通查询。你必须传入 ObjectContext。
    • 这很不幸。我想要一个名为“ActiveProducts”的漂亮只读属性,而不是需要我的上下文实例的方法。你确定没有变通办法吗?
    • @Keith 这是 EF 的设计缺陷,恕我直言。 L2S 也有同样的问题,这是一个经过深思熟虑的 ORM(现已弃用)。所以也许是有原因的。
    【解决方案2】:

    使用 Linq,默认设置是在可枚举的每次迭代中获取数据。如果要一次获取所有行,请在查询中调用 .ToList() 。这似乎是更有利的方法。

    【讨论】:

    • 已经试过了:return this.ProductCategories.Where(c =&gt; !c.Product.IsDeleted &amp;&amp; c.Product.IsActive).OrderBy(c =&gt; c.SortOrder).Select(c =&gt; c.Product).ToList(); 仍然会导致多次往返。
    • 看来 usr 的回答是准确的。使用导航属性 c.Product 会导致它进行多次往返。也许有一种方法可以将其重构为某种类型的连接?不确定如何使用扩展方法。
    猜你喜欢
    • 2011-09-02
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多