【问题标题】:LINQ doing individual queries when it should have the dataLINQ 在应该有数据时执行单独的查询
【发布时间】: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。

标签: c# sql linq


【解决方案1】:

您当前正在创建一个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());
}

Query Execution (LINQ)

【讨论】:

  • 我很确定 foreach 应该已经实现了查询 - 至少,我的 LINQ to SQL 确实如此。 EF / EF Core 有什么不同吗?从here 我看到 EF/EF Core 是这样的:“稍后,当第一次迭代调用迭代器的 MoveNext 方法时,会生成并执行 SQL 查询。在每次迭代中,都会从 SQL 执行结果中具体化一个实体。 "
  • 应该,不知道为什么 OP 看到了不同的东西。
  • 你所拥有的几乎就是我一直在做的。我希望 .ToList() 或 .ToArray() 表明我不想延迟加载。
猜你喜欢
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多