var aaa = _dbContext.IdentityAppUsers
.Where(x => x.Uuid == 'ABC')
.SelectMany(l => l.OrganisationOrganisationUsers)
.Select(x =>
x.Organisation!.OrganisationStandards
.Select(od => od.Uuid).First());
由于OrganisationStandards是一个空集合,我预计上面的查询将在First()方法上抛出一个no sequence异常,但它没有。
有什么想法吗
生成的sql就像
SELECT (
SELECT o1.uuid
FROM query.organisation_standard AS o1
WHERE o0.id = o1.organisation_id
LIMIT 1)
FROM query.identity_app_user AS i
INNER JOIN query.organisation_organisation_user AS o ON i.id = o.user_id
INNER JOIN query.organisation_organisation AS o0 ON o.organisation_id = o0.id
WHERE i.uuid = 'ABC'
1条答案
按热度按时间o8x7eapl1#
因为
x.Organisation!.OrganisationStandards.Select(od => od.Uuid).First()
实际上并不是一个C#调用,正如您可以清楚地看到的那样,它被转换为SQL。如果od.Uuid
是一个不可空的值类型,它实际上应该抛出(尽管它完全是另一个异常-System.InvalidOperationException: Nullable object must have a value.
)。EF试图将查询转换为SQL,尽可能接近.NET行为,但这并不总是可能的,或者有时很麻烦或有很多边缘情况。例如,在这个例子中,如果
od.Uuid
是一个可空字符串,那么要确定返回的null
是来自数据库的实际空值还是缺失的行,这将是一个更复杂的查询。