如何优化此子级检索 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 语句

> 使用 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。