LINQ在应该拥有数据时进行单独查询

时间:2018-04-20 19:00:55

标签: c# sql linq

我是LINQ和C#的新手,但是对其他ORM有经验。我看到的是一种我不喜欢的行为,或者认为我不喜欢这种行为,并试图弄清楚如何制止它。

我有一个类似......的查询。

var query = from x in MyTable
            where myListOfIds.Contains(x.parentId)
            select x;

这给了我看起来像这样的SQL ......

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[ParentId] AS [ParentId], 
    [Extent1].[Blah] AS [Blah], 
    FROM [dbo].[MyTable] AS [Extent1]
    WHERE [Extent1].[ParentId] IN (1, 2, 3)
-- Executing at 4/20/2018 1:26:08 PM -05:00 
-- Completed in 241 ms with result: SqlDataReader

这就是我想要的。它返回3行数据。所以,当我遍历每一行......

foreach (var row in query)
{
    Debug.WriteLine("Row ID is " + row.Id.ToString());   
}

我可以看到3个额外的查询,例如......

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[ParentId] AS [ParentId], 
    [Extent1].[Blah] AS [Blah], 
    FROM [dbo].[MyTable] AS [Extent1]
    WHERE [Extent1].[ParentId] = @EntityKeyValue1
-- EntityKeyValue1: '1' (Type = Int32, IsNullable = false)
-- Executing at 4/20/2018 1:53:37 PM -05:00
-- Completed in 209 ms with result: SqlDataReader

我认为带有IN子句的SQL将获得所有数据,并且不需要其他查询。我已经尝试过.ToList()和.ToArray(),希望这会阻止其他查询。

有关如何一次性获取所有数据的任何提示?

由于

1 个答案:

答案 0 :(得分:0)

您当前正在创建IQueryable,在您对其执行操作之前,该Id未实现为记录列表。在这种情况下,您将迭代每条记录并检索.ToList(),因此它每条记录执行一次查询。

您可以做的是使用.ToArray()var query = (from x in MyTable where myListOfIds.Contains(x.parentId) select x); // Note that query is simply an IQueryable at this point, // so we should execute the query and materialize the data var records = query.ToList(); foreach (var row in records) { // At this point, records is now a list in memory Debug.WriteLine("Row ID is " + row.Id.ToString()); } 在一次通话中实现整个记录列表,此时您应该拥有内存中的所有记录。

data: {
message: 'Hello Vue!'
}

请参阅Query Execution (LINQ)