C# DefaultIfEmpty的解决方法

C# DefaultIfEmpty的解决方法,c#,linq,enums,entity-framework-core,C#,Linq,Enums,Entity Framework Core,我有这样的想法: public enum CoolEnum { Yes = 0, No = 1, Perhaps = 2, Maybe = 3, Perchance = 4, } 我想做以下几点: CoolEnum? enum = await this.context .MyTable .Where(x => x.Id == id) .Select(x => x.Co

我有这样的想法:

public enum CoolEnum
{
  Yes = 0,
  No = 1,
  Perhaps = 2,
  Maybe = 3,
  Perchance = 4,
}
我想做以下几点:

CoolEnum? enum = await this.context
                .MyTable
                .Where(x => x.Id == id)
                .Select(x => x.CoolEnum)
                .DefaultIfEmpty((CoolEnum?)null)
                .FirstAsync();
CoolEnum enum = await this.context
                .MyTable
                .Where(x => x.Id == id)
                .Select(x => x.CoolEnum)
                .FirstAsync();

CoolEnum? nullableEnum = enum == default ? null : enum;
但是我得到了错误

Processing of the LINQ expression 'DefaultIfEmpty<Nullable<CoolEnum>> (...) failed.
This may indicate either a bug or a limitation in EF Core. 
但这会将所有现有枚举的默认值更改为null,这不是我想要的

我可以使用哪种干净的解决方法?我看到以下选项:

  • 返回MyTable的整个对象。但如果规模很大,这是对资源的浪费
  • 在我的枚举中定义一个“null”默认元素
  • 将查询拆分为两个查询,一个用于查看是否存在元素,另一个用于获取元素

他们俩看起来都不干净。有更好的主意吗?

您可以选择可为null的值(通过使用常规的C#cast转换为相应的可为null的类型),然后选择
FirstOrDefault{Async}

.Select(x => (CoolEnum?)x.CoolEnum)
.FirstOrDefaultAsync();

DefaultEmpty与左外部联接一起使用。请看:我认为DefaultEmpty也可以用于任何其他内容。