我是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(),希望这会阻止其他查询。
有关如何一次性获取所有数据的任何提示?
由于
答案 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!'
}