实体框架 6 - 如果查询不包含行,则检索 null 而不是默认值

djm*_*jmj 4 linq lambda entity-framework

实体Foo:

public int Foo { get; set; }

EF 查询:

int? barX = FOOs.GetQuery().Where(f => f.x == x).Select(f => f.bar).SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

如果没有行f.x == x但我想返回,则返回整数的默认值 0 null

如何实现这一目标?

0 没有明确指示结果是否为空或列值确实为 0!

Dis*_*ile 5

您可以在之后拉回完整的实体和项目,而不是在查询中进行投影:

var foo = FOOs.GetQuery().Where(f => f.x == x).SingleOrDefault();
int? barX = foo != null ? (int?)foo.bar : null;
Run Code Online (Sandbox Code Playgroud)

如果您担心获取整个实体,那么您可以返回匿名类型而不是完整的实体:

var foo = FOOs.GetQuery().Where(f => f.x == x).Select(new { bar = f.bar }).SingleOrDefault();
int? barX = foo != null ? (int?)foo.bar : null;
Run Code Online (Sandbox Code Playgroud)

感谢@Flater,因为我不知道这是可能的(只需将其投射到投影中):

int? barX = FOOs.GetQuery().Where(f => f.x == x).Select(f => (int?)f.bar).SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

  • 从OP的原始片段来看,`.Select(f => (int?) f.bar).SingleOrDefault()`应该不能解决问题吗?与向代码添加额外的评估相比,这似乎是一种更简洁的方法。 (4认同)
  • @djmj:公平地说,int 根本不能为空。这并不是说 EF 不想返回 null,而是因为该语言不支持值类型的“null”。 (2认同)