Linq查询在哪里列出,性能最好的是什么?

时间:2014-03-04 08:22:27

标签: c# linq entity-framework

我有一个简单的linq查询,它从产品的数据库中获取一个slug。

var query = from url in urlTable
            where url.ProductId == productId &&
            url.EntityName == entityName &&
            url.IsActive
            orderby url.Id descending
            select url.Slug

我正在尝试对此进行优化,因为它针对每个产品运行,而在类别页面上运行的次数是产品数量的x倍。

我可以这样做(如果我没有误会),请发送产品列表并进行新的查询。

var query = from url in urlTable
            where productList.Contains(url.ProductId) &&
            url.EntityName == entityName &&
            url.IsActive
            orderby url.Id descending
            select url.Slug

但我在某处读过Contains的表现不好。有没有其他方法可以做到这一点?明智的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

  

但我在某处读过Contains的表现不好。

我相信你将它与string.Contains混合在一起,这对大型数据集来说确实是一个坏主意,因为它根本无法使用任何索引。

无论如何,为什么你猜测的表现?你应该剖析并看看对你自己有什么好处。另外,查看每个查询生成的SQL并查看各自的查询计划。

现在,有了这个,第二个查询更好,因为它在一次查询期间尽可能多地抓取,从而消除了大量开销。如果你只询问了两三次,那就太明显了,但是一旦你说了一百次,你就有麻烦了。除了在客户端 - 服务器通信方面更好,它在服务器上也更好,因为它可以非常有效地使用索引,而不是一个接一个地查找X项。请注意,对于通常没有对数访问时间的主键,这可能是微不足道的。

答案 1 :(得分:1)

第二种选择更好。我会将product-id添加到结果中,以便您区分产品。

var query = from url in urlTable
            where productList.Contains(url.ProductId) &&
            url.IsActive
            orderby url.Id descending
            select new { ProductId, Slug }

请注意,您的product-id列表将转换为sql-parameters IN (@p1, @p2, @p3),并且每个sql-query都有最大量的sql-parameters。我认为限制在2000左右参数。因此,如果您要查询超过2000种产品,此解决方案将无效。

答案 2 :(得分:-1)

var query = from productId in productList
            join url in urlTable on productId equals url.ProductId
            where url.IsActive
            orderby url.Id descending
            select url.Slug;

我相信这个查询会有更好的表现。