如何优化这个linq查询?

问题描述:

我有这样的LINQ to SQL查询:如何优化这个linq查询?

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() 
    }; 

这三个表。我需要加入这些项目的类别,但是有一个表格(多对多)。有没有更好的做这个查询?

+1

您是否检查过生成的sql及其查询计划? – 2010-12-07 20:18:39

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

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() 
    }; 

看我怎么删除的连接语句,但使用的itemitemCategories财产?

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

这可能会导致客户端和数据库服务器之间产生大量“喋喋不休”,以及在您的TDS流中重复发送标题数据的额外开销。

您可能想要考虑在这里执行连接并展开数据。这只需要一次查找,代价是复制左侧的数据(项目)。

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