如何优化这个 linq 查询?

Posted

技术标签:

【中文标题】如何优化这个 linq 查询?【英文标题】:How to optimize this linq query? 【发布时间】:2010-12-07 20:10:17 【问题描述】:

我有这个 linq to sql 查询:

var items =
    from i in context.Items
    orderby i.itemId descending
    select new ItemWithCategories
    
        item = i,
        categories = (
            from cats in context.categories 
            join ic in context.itemCategories 
                on cats.categoryId equals ic.categoryId
            where ic.itemId == i.itemId
            select cats).ToList()
    ;

这是三张桌子。我需要将类别与项目连接起来,但中间有一个表(多对多)。有没有更好的方法来做这个查询?

【问题讨论】:

你检查过生成的sql和他们的查询计划吗? 【参考方案1】:

这会产生相同的结果,但更容易阅读:

var items =
    from item in context.Items
    orderby item.itemId descending
    select new ItemWithCategories
    
        item = item,
        categories = (
            from itemCategory in item.itemCategories
            select itemCategory.category).ToList()
    ;

看看我是如何删除 join 语句的,但使用 itemitemCategories 属性?

【讨论】:

【参考方案2】:

您拥有的查询将创建一个对象列表,这些对象将引用查询(类别),然后在访问它们时执行(如果有的话)。

这可能会导致客户端和数据库服务器之间出现大量“喋喋不休”,以及通过 TDS 流重复发送标头数据的额外开销。

您可能需要考虑在此处执行联接并展平数据。它只需要一次查找,代价是复制左侧(项目)的数据。

当然,任何优化,关键是测试,测试,测试。

【讨论】:

以上是关于如何优化这个 linq 查询?的主要内容,如果未能解决你的问题,请参考以下文章

Linq学习笔记

C# linq 如何编写子查询?

优化 LINQ 查询

使用Automapper优化相关子查询

优化 LINQ 查询所需的帮助

EF LINQ 查询性能优化