如何优化此子级检索 linq-to-sql 语句
本文关键字:检索 linq-to-sql 语句 何优化 优化 | 更新日期: 2023-09-27 18:32:24
我有这个函数式Linq-to-Sql语句。
public IEnumerable<int> GetChildIds(IEnumerable<int> selectedParentIds)
{
using (var context = new MyContext())
{
return context.Children
.Where(c => selectedParentIds.Contains(c.parentId))
.Select(c => c.Id)
.ToList();
}
}
它根据要求为我提供了选定的子 ID,但是我一直在运行 SQL 事件探查器。
此语句似乎为每个selectedParentId
向数据库发送单独的请求,这对我来说似乎是次优的。
有没有办法重组此语句以最大程度地减少服务器的流量?我应该采取不同的方法吗,或者,这是否一样好?
编辑
感谢您的指导。
这是我对我的跟踪输出的解释的一个错误,Linq-To-SQL对SQLServer 2005做了一个完全合理的陈述,就像它对SQLServer 2008所做的那样。问题出在别处。
> 使用 LINQ to SQL 针对 SQL 2008 的同一查询会生成单个 SQL 查询。 您是否能够针对 SQL Server 2008 进行测试?
例如:
IEnumerable<int> list = new List<int>{1,2,3};
Models.Where (m => list.Contains(m.Id)).Select (m => m.Id).ToList();
生产
-- Region Parameters
DECLARE @p0 Int = 1
DECLARE @p1 Int = 2
DECLARE @p2 Int = 3
-- EndRegion
SELECT [t0].[Id]
FROM [Models] AS [t0]
WHERE [t0].[Id] IN (@p0, @p1, @p2)
使用实体框架产生同样的事情
SELECT
[Extent1].[Id] AS [Id]
FROM [dbo].[Models] AS [Extent1]
WHERE [Extent1].[Id] IN (1,2,3)
因此,如果无法根据SQL 2005进行检查,我将冒险说,不,除非您升级服务器,否则您将无能为力。
这会产生什么不同的东西吗?
public IEnumerable<int> GetChildIds(IEnumerable<int> selectedParentIds)
{
using (var context = new MyContext())
{
return context.Children
.Where(c => selectedParentIds.Any( p => p == c.parentId ))
.Select(c => c.Id)
.ToList();
}
}
如果你得到不同版本的SQL Server的不同输出,你可以随时尝试这样的东西
public IEnumerable<int> GetChildIds(IEnumerable<int> selectedParentIds)
{
using (var context = new MyContext())
{
var query = context.Children;
foreach (var id in selectedParentIds)
{
query = query.Where(q => q.parentId == id);
}
return query.Select(q => q.Id)
.ToList();
}
}
我不再有 SQL Server 2005 的实例来测试它(使用兼容模式的 SQL Server 2008 R2 仍然生成单个查询,即使对于您的初始代码也是如此),但这应该生成一个具有多个 where 子句的查询,无论您使用哪个版本的 SQL Server。