Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ在应该有数据的时候进行单独的查询_C#_Sql_Linq - Fatal编程技术网

C# LINQ在应该有数据的时候进行单独的查询

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

我对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(),希望这样可以避免额外的查询

关于如何一次获取所有数据有什么提示吗


谢谢

您当前正在创建一个
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()表示我不想延迟加载。