定义SingleOrDefault Linq方法的默认值

And*_*elt 3 c# linq entity-framework

我尝试从实体框架获取数据记录ID:

var plantAreaID = await db.PlantAreas
  .Where(p => p.Plant.CompanyNo == companyNo && p.Plant.Abbreviation == companyAbbr)
  .Select(p => p.ID)
  .SingleOrDefaultAsync();
Run Code Online (Sandbox Code Playgroud)

问题是,存在一个PlantAreaID为0的ID。但是,如果SingleOrDefault未找到任何记录,则返回0。那么,如何区分ID 0和没有找到数据的情况?

我的第一个想法是提供默认值-1,但SingleOrDefault在这个星座中似乎不支持该值。

我怎样才能做到这一点?

gnu*_*nud 5

null 是指示缺失值的正常方法。

var plantAreaID = await db.PlantAreas
   .Where(p => p.Plant.CompanyNo == companyNo && p.Plant.Abbreviation == companyAbbr)
   .Select(p => new int?(p.ID))
   .SingleOrDefaultAsync();
Run Code Online (Sandbox Code Playgroud)

如果您要使用-1表示缺失值,可以说

var plantAreaID = await db.PlantAreas
   .Where(p => p.Plant.CompanyNo == companyNo && p.Plant.Abbreviation == companyAbbr)
   .Select(p => new int?(p.ID))
   .SingleOrDefaultAsync() ?? -1;
Run Code Online (Sandbox Code Playgroud)

  • *“ null”是指示缺失值的正常方法。“ *这就是答案。成本是单个可为空的强制转换,即零。通常,`DefaultIfEmpty`和魔术数字更差。请注意,即使对于不可为空的表达式,返回NULL对于SQL来说也是很自然的-强制转换只是使C#​​编译器满意而已。 (3认同)