【问题标题】:Entity Framework Take() returns more elements [duplicate]实体框架 Take() 返回更多元素 [重复]
【发布时间】:2016-05-04 11:31:18
【问题描述】:

谁能解释一下为什么下面的查询返回 8 艘船的列表?

 var vessels = await db.Vessels
                       .Include(m => m.Images.Select(c => c.Activity))
                       .Include(m => m.VesselAddresses.Select(c => c.Address))
                       .Where(m => m.Images.Any(c => c.Activity.Active))
                       .Where(m => m.Activity.Active)
                       .Where(m => m.Listed)
                       .Where(m => m.Activity.User.Active)
                       .OrderBy(m => Guid.NewGuid())
                       .Take(4)
                       .ToListAsync();

如果我从查询中删除 Include(m => m.VesselAddresses.Select(c => c.Address))OrderBy,那么它可以正常工作并返回 4 条记录,但如果我保持原样,那么它会返回 8 条记录,即使我指定了 Take(4)

编辑

这与公寓表的查询几乎相同,但该查询运行良好,并且总是返回 4 行:

 var apartments = await db.Apartments
                        .Include(m => m.Images.Select(c => c.Activity))
                        .Include(m => m.Address)
                        .Where(m => m.Images.Any(c => c.Activity.Active))
                        .Where(m => m.Activity.Active)
                        .Where(m => m.Listed)
                        .Where(m => m.Activity.User.Active).OrderBy(m => Guid.NewGuid())
                        .Take(4)
                        .ToListAsync();

【问题讨论】:

  • 您可能想看看这个答案:stackoverflow.com/a/12065589/4550393。那里的语句是:“请记住,在完成 foreach 或 ToList() 之前,linq-To-Entities 查询实际上不会对数据库进行往返。”可能这是一个提示。

标签: c# entity-framework


【解决方案1】:

实体框架在您调用 ToListAsync 之前不会运行您正在执行的查询,因此我的猜测是您的 Include 不能被翻译成 SQL,因此查询生成器会忽略它,直到它执行由于take 转换为sql 为TOP 的SQL,意味着在Take 之后应用了包含

在 .ToListAsync() 之后移动 .Take(4) 应该更正

我还假设您正在使用 .OrderBy(m => Guid.NewGuid()) 来随机化我建议的结果 Random.NextDouble() guid 对于随机化来说太过分了

【讨论】:

  • 您有什么建议作为解决方案?如果我放置 Take(2),而不是 Take(4),我会得到想要的效果,但是代码看起来会误导。另外,我有几乎完全相同的查询的公寓表,它工作得很好。我将使用该信息更新我的问题。
  • 在 ToListAsync() 之后移动 Take(4) 是否过大,并且会将数千条记录而不是 4 条记录到内存中?
猜你喜欢
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 2018-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多