当未找到记录时,对于不可为空的列返回 null

Bas*_*sin 4 c# entity-framework-core

实体类型

public class Person
{
    public Guid Id { get; set; }

    public string Name { get; set; }

    public Guid TeamId { get; set; } // mandatory foreign key

    public virtual Team Team { get; set; } // navigation property

    // dozen other properties
}

public class Team
{
    public Guid Id { get; set; }

    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个方法可以返回给定人员 ID 的团队 ID。方法的返回类型定义为Guid?. 可以为 Null,因为数据库中可能不存在给定的人员 ID。

public Task<Guid?> GetTeamIdFor(Guid personId)
{
    using (var context = _createDbContext())
    {
        return await context.Persons
            .Where(p => p.Id == personId)
            .Select(p => p.TeamId)
            .FirstOrDefault();
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是返回类型(列类型)FirstOrDefault()的默认值。因此,不要返回方法返回空 Guid 。GuidTeamIdnull00000000-0000-0000-0000-000000000000

我可以通过加载整个实体来实现所需的结果,但我尽量避免加载额外的、不需要的数据。

var person = await context.FindAsync(personId);
return person?.TeamId;
Run Code Online (Sandbox Code Playgroud)

我可以在返回值之前检查空 Guid

var teamId = await context.Where(p => p.Id = personId).Select(p => p.TeamId).FirstOrDefaultAsync();
return teamId == Guid.Empy ? default(Guid?) : teamId;
Run Code Online (Sandbox Code Playgroud)

问题:有没有一种方法可以使查询返回可为空的 Guid,而无需加载整个实体或在结果实现后无需进行任何操作?

Jam*_*rns 5

您可以将 TeamId 转换为可为 null 的 Guid,这允许 FirstOrDefault 在未找到任何内容时返回 null:

Guid? id = context.Persons
  .Where(p => p.Id == personId)
  .Select(p => (Guid?)p.TeamId)
  .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)