【发布时间】:2018-04-21 04:05:21
【问题描述】:
我对 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(),希望这会阻止额外的查询。
关于如何一次性获取所有数据的任何提示?
谢谢
【问题讨论】:
-
Entity Framework 进行延迟加载,这意味着在访问时加载。如果您想要一个查询,请确保使用 .Include 更多阅读 msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx
-
@SCFi OP 没有访问导航属性。
-
您使用的是 EF 或 EF Core 还是 LINQ to SQL?还有什么数据库引擎?这不应该发生。
-
我认为我们正在使用 EF 6.1.1(根据参考资料)和 SQL Server。