Entity Framework Core的随机顺序-错误或错误使用?

时间:2018-07-23 16:24:38

标签: entity-framework-core ef-core-2.0 ef-core-2.1

在将.include()与随机顺序结合使用时,我观察到一种奇怪的行为:

在我的项目中,我创建了两个表:“ Product”和“ ProductImage”,它们与导航属性(=数据库中的外键)相关。产品可以具有相关的产品图片-但是也有没有图片的产品。

假设我要加载具有相关产品图片(按“ CreationTime”(日期时间)列排序)的前10个产品:

Context
    .Product
    .Include(p => p.ProductImage)
    .Where(p => p.ProductImage.Any())
    .OrderBy(p => p.CreationTime)
    .Take(10)
    .ToListAsync()

这可以正常工作,并且符合预期。但是,当我将订单更改为

.OrderBy(p => Guid.NewGuid())

随机获得十个带有图像的产品,我确实得到了十个产品实体,但没有相关图像。

起初,我以为以某种方式删除了.include(),因为EF核心“认为”不需要相关数据(实际上是一项功能)-因此我使用SQL Server Profiler调查了查询:

我观察到,EF Core构造了一个查询以在Product中加载10行(带有正确的WHERE子句以仅选择带有图像的产品)和一个查询以在ProductImage中加载10行。 但是问题在于,EF内核将Product.Include(p => p.ProductImage)分为两个单独的SELECT,每个SELECT都有自己的ORDER子句。而且由于我给出了一个随机顺序,所以每个SELECT都有自己的“ ORDER BY NEWID()”。

因此,最后加载的产品不属于已加载的10个产品映像(如果数据库中存在十个以上的产品,至少很有可能)。

所以我的问题是:在这一点上我是否错误地使用EF Core-还是这确实应该起作用(我应该以某种方式进行报告)?非常感谢你!

0 个答案:

没有答案