Linq 实体框架6-如果查询不包含行,则检索null而不是默认值
实体Foo:Linq 实体框架6-如果查询不包含行,则检索null而不是默认值,linq,entity-framework,lambda,Linq,Entity Framework,Lambda,实体Foo: int? barX = FOOs.GetQuery().Where(f => f.x == x).Select(f => f.bar).SingleOrDefault(); public int Foo{get;set;} EF查询: int? barX = FOOs.GetQuery().Where(f => f.x == x).Select(f => f.bar).SingleOrDefault(); 如果没有f.x==x但我想返回null的行,则返
int? barX = FOOs.GetQuery().Where(f => f.x == x).Select(f => f.bar).SingleOrDefault();
public int Foo{get;set;}
EF查询:
int? barX = FOOs.GetQuery().Where(f => f.x == x).Select(f => f.bar).SingleOrDefault();
如果没有f.x==x
但我想返回null
的行,则返回整数的默认值0
如何做到这一点
无论结果是空的还是列值真的是0,0都不是明确的指示器 不必在查询中进行投影,您可以在以下操作之后收回完整的实体和项目:
var foo = FOOs.GetQuery().Where(f => f.x == x).SingleOrDefault();
int? barX = foo != null ? (int?)foo.bar : null;
如果您担心获取整个实体,那么可以返回匿名类型,而不是完整类型:
var foo = FOOs.GetQuery().Where(f => f.x == x).Select(new { bar = f.bar }).SingleOrDefault();
int? barX = foo != null ? (int?)foo.bar : null;
感谢@Flater,因为我不知道这是可能的(只需在投影中投射):
这是一个有效的解决方法,但如果可能的话,我不想从OP的原始代码片段中提取整个实体。是否应
。选择(f=>(int?.f.bar)。SingleOrDefault()
是否不解决此问题?似乎是一种比向代码中添加额外求值更简洁的方法。@如果您想要简单的代码,当然可以。=)我根据你的建议再次编辑了答案,但请随意发布答案,我将删除编辑。谢谢@Flater。我仍然认为这是EF的一个大问题@公平地说,int不能是null。并不是EF不想返回null,而是因为该语言不支持值类型的null
。