我有一个简单的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的表现不好。有没有其他方法可以做到这一点?明智的最佳方法是什么?
答案 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;
我相信这个查询会有更好的表现。