postgresql 为什么first()方法在下面的查询中没有抛出序列异常

rsl1atfo  于 2023-05-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(92)
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'
o8x7eapl

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是来自数据库的实际空值还是缺失的行,这将是一个更复杂的查询。

相关问题