延迟加载、集合和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;

我明白了,为什么从用户栏获取个人资料照片更方便。

延迟加载、集合和Single或First

您可以通过使用投影来获得单个数据库查询的结果:

var userWithProfilePhoto = dbContext.Users
    .Where(u => u.Id == 1)
    .Select(u => new
    {
        User = u,
        ProfilePhoto = u.Photos.Where(p => p.IsProfilePhoto).FirstOrDefault()
    })
    .SingleOrDefault();

userWithProfilePhoto.UseruserWithProfilePhoto.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, AnyCount的条件和无参数重载。

编辑:

我的错,MSDN直接提到了它,但是任何对导航属性的引用(当启用延迟加载时)都会加载所有相关的记录。

我最好的建议是a)接受额外的数据库访问,或者b)查询,就像你在另一个例子中所做的那样,第一个表是"一对多"关系的"许多"。

First和FirstOrDefault是惰性加载,Single和SingleOrDefault是急切加载。如果您不需要在查询返回多个项的情况下抛出一个异常,您可以将其更改为FirstOrDefault。