2

我有这个功能性的 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 Profiler。

该语句似乎向数据库发送了一个单独的请求,selectedParentId这对我来说似乎不是最佳的。

有没有办法可以重组这个语句来最小化与服务器的流量?我应该采取不同的方法吗,或者,这是否一样好?

编辑

感谢您的指导。

这是我对跟踪输出的解释的错误,Linq-To-SQL 为 SQLServer 2005 做出了完全合理的陈述,就像它为 SQLServer 2008 所做的那样。问题出在其他地方。

4

3 回答 3

1

针对 SQL 2008 使用 LINQ to SQL 的相同查询会生成单个 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 检查这一点,我会冒险说,不,除非您升级服务器,否则您无能为力。

于 2012-04-27T16:50:40.657 回答
1

这会产生什么不同吗?

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();
}
}
于 2012-04-27T16:52:53.240 回答
0

如果您为不同版本的 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。

于 2012-04-27T17:20:22.587 回答