C# LINQ在应该有数据的时候进行单独的查询
我对LINQ和C#真的是个新手,但是我对其他ORM有经验。我看到了一种我不喜欢的行为,或者我认为我不喜欢的行为,我正在努力想办法阻止它 我有一个疑问,像C# LINQ在应该有数据的时候进行单独的查询,c#,sql,linq,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].[Pa
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(),希望这样可以避免额外的查询
关于如何一次获取所有数据有什么提示吗
谢谢您当前正在创建一个
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());
}
请参见实体框架执行延迟加载,这意味着访问时加载。如果需要一个查询,请确保使用.Include进行更多读取@SCFi,OP不会访问导航属性。是否使用EF或EF Core或LINQ to SQL?还有什么数据库引擎?这不应该发生。我认为我们使用的是EF 6.1.1(根据参考资料)和SQL Server。我非常确定
foreach
应该实现查询-至少我的LINQ to SQL实现了。EF/EF Core是否在这方面有所不同?从EF/EF Core中我看到了这一点:“稍后,当为第一次迭代调用迭代器的MoveNext方法时,会生成并执行SQL查询。在每次迭代中,都会从SQL执行结果中具体化一个实体。”它应该不确定OP为什么会看到不同的结果。您所看到的与我所做的差不多。我希望.ToList()或.ToArray()表示我不想延迟加载。