【发布时间】:2018-10-30 19:24:00
【问题描述】:
这些天我越来越少使用连接,并尽可能依赖导航属性。
这是一个非常基本的架构:
用户:
Id int
Surname string
FirstName string
注册:
Id int
UserId int (foreign key for Users.Id)
EnrolmentName string
StartDate datetime
EndDate datetime
Enrolments 表中的用户可能有 0 个、1 个或多个与其相关的注册。
现在在查询中,我想选择所有用户行,以及他们第一次注册时的 EnrolmentName 列。我喜欢让我的查询尽可能精简,并且只从数据库中选择我需要的内容。如果没有必要,我不喜欢返回整个实体。
这是我的查询(我将相关数据直接选择到视图模型中)。
IList<UserVm> rows = db.Users
.Select(
x => new UserVm
{
Id = x.Id,
Surname = x.Surname,
FirstName = x.FirstName,
FirstEnrolmentName = x.Enrolments.OrderBy(o => o.StartDate).FirstOrDefault().EnrolmentName
}
)
.ToList();
我遇到的问题是它可以工作,但我认为在遇到没有注册的用户时它应该会失败。我希望以下行会抱怨在空对象上找不到 EnrolmentName 列。
FirstEnrolmentName = x.Enrolments.OrderBy(o => o.StartDate).FirstOrDefault().EnrolmentName
实际发生的情况是,在该用户没有 Enrolment 记录的情况下,它会将 EnrolmentName 列保留为 NULL。
我想知道:
为什么此查询有效且不会导致 0
Enrolments的学生出错。是否有一种更简洁的方式来编写查询,以便它仍然只命中数据库 1 次,并且仍然只选择所需的列子集,而不是全部。
【问题讨论】:
标签: entity-framework linq-to-sql entity-framework-6 linq-to-entities