延迟加载、集合和Single或First
本文关键字:First Single 集合 延迟加载 | 更新日期: 2023-09-27 18:01:38
我有以下模型:
用户有一个照片集合。在照片模型中,有一个名为isprofilepphoto的属性。
当我执行以下操作时,结果与预期的不同。
var user = dbContext.Users.SingleOrDefault(u => u.Id == 1);
var profilePhoto = user.Photos.SingleOrDefault(p => p.IsProfilePhoto);
在延迟加载的情况下,执行两个查询。
第一个按预期的id获取用户。而第二个,通过用户id获取照片集合然后在内存中对isprofilepphoto进行匹配。
我希望与懒惰加载它将添加SingleOrDefault查询以及。
这是不可能的,我必须总是做逆吗?例如
var profilePhoto = dbContext.Photos.SingleOrDefault(p => p.UserId == 1 && p.IsProfilePhoto);
var user = profilePhoto.User;
我明白了,为什么从用户栏获取个人资料照片更方便。
您可以通过使用投影来获得单个数据库查询的结果:
var userWithProfilePhoto = dbContext.Users
.Where(u => u.Id == 1)
.Select(u => new
{
User = u,
ProfilePhoto = u.Photos.Where(p => p.IsProfilePhoto).FirstOrDefault()
})
.SingleOrDefault();
userWithProfilePhoto.User
和userWithProfilePhoto.ProfilePhoto
是您要查找的两个实体。
你必须使用急切加载来加载多个关卡。延迟加载,当你访问这个时加载关卡。
var user = dbContext.Users.Include(u => u.Photos).SingleOrDefault(u => u.Id == 1);
var profilePhoto = user.Photos.SingleOrDefault(p => p.IsProfilePhoto);
这是LINQ方法的细微差别。
您可以将过滤作为查询的一部分:
var profilePhoto = user.Photos.Where(p => p.IsProfilePhoto).SingleOrDefault();
由于LINQ to Entities中的这种行为,我尝试始终使用Where
方法来处理First
, Single
, FirstOrDefault
, SingleOrDefault
, Any
和Count
的条件和无参数重载。
我的错,MSDN直接提到了它,但是任何对导航属性的引用(当启用延迟加载时)都会加载所有相关的记录。
我最好的建议是a)接受额外的数据库访问,或者b)查询,就像你在另一个例子中所做的那样,第一个表是"一对多"关系的"许多"。
First和FirstOrDefault是惰性加载,Single和SingleOrDefault是急切加载。如果您不需要在查询返回多个项的情况下抛出一个异常,您可以将其更改为FirstOrDefault。