Entity framework 为什么FirstOrDefault和ToList在某些情况下返回不同的结果?
我有一个引用自身的实体模型,如:Entity framework 为什么FirstOrDefault和ToList在某些情况下返回不同的结果?,entity-framework,Entity Framework,我有一个引用自身的实体模型,如: public class User { public int Id { get; set; } [MaxLength(150)] [Required] public string FirstName { get; set; } [Required] public int? CreatedByUserId { get; set; } [ForeignKey("CreatedByUserI
public class User
{
public int Id { get; set; }
[MaxLength(150)]
[Required]
public string FirstName { get; set; }
[Required]
public int? CreatedByUserId { get; set; }
[ForeignKey("CreatedByUserId")]
public ICollection<User> CreatedUsers { get; set; }
[ForeignKey("CreatedByUserId")]
public User CreatedByUser { get; set; }
}
奇怪的是,当我对result1的查询调用ToList()
时,它返回正确的结果。在VisualStudio调试中查看结果时也是如此
有人能解释一下发生了什么事吗?我想这并不重要,因为调用
FirstOrDefault
设置了底层SQL查询的Top
参数,但仍然。。这让我在调试时感到非常头疼。了解一下延迟执行:嘿,刚刚尝试了一下,结果也一样。我真的不明白为什么会这样。几乎对我来说是个bug。你确定Tom和Rita在他们的CreatedByUser
字段上都有值吗?因为CreatedByUserId是可空的,如果该值为空,那么.Include将不会显示具有空值的条目。请尝试在.Where()
语句之前插入.Include(m=>m.CreatedByUser)
,并检查是否有任何差异。删除了我自己的注释bc,我自己也尝试过。不,这不是一个bug,我想这是因为你说的是Users.Where().Take(1)->现在什么都没有发生,直到现在,因为你没有说出你想要什么。正如您所说,添加ToList()可以解析查询,然后您可以调用其他include。请看这里:
// say that user 'Rita' was created by 'Tom'
var result1 = await Dependencies.AppDbContext.Users.Where(m => m.FirstName == "Rita").Take(1).Include(m => m.CreatedByUser).FirstOrDefaultAsync();
// result1 = 'Tom', but I would expect it to be 'Rita';
var result2 = await Dependencies.AppDbContext.Users.Where(m => m.FirstName == "Rita").Include(m => m.CreatedByUser).FirstOrDefaultAsync();
// result2 = 'Rita' which is what I expect