在将.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-还是这确实应该起作用(我应该以某种方式进行报告)?非常感谢你!