实体框架Take()返回更多元素

时间:2016-05-04 11:31:18

标签: c# entity-framework

有人可以解释为什么以下查询会返回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条记录,即使我指定了{ {1}}

修改

这对于apartments表几乎是相同的查询,但是这个查询工作得很好并且总是返回4行:

Take(4)

1 个答案:

答案 0 :(得分:0)

实体框架在您调用ToListAsync之前不会运行您正在进行的查询,因此我的猜测是您将Include无法转换为SQL,因此查询构建器会忽略它直到它之后执行因为takeTOP转换为sql的SQL,意味着在Take之后应用了包含

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

我还假设你正在使用.OrderBy(m => Guid.NewGuid())来随机化我建议的结果而不是Random.NextDouble() guid对随机化来说是过度的