如何更改查询以使结果不等于 NULL



我将 LINQ 用于项目中的实体。 在某些时候,我从数据库中获取数据:

int vectorLayerId = 5;
int pointFeatId = 10;
var RealValue = x.VectorLayer_FieldsValue
.Where(f=>f.FeatIdPointFeatures == vectorLayerId && f.VectorLayerFieldsId == pointFeatId)
.Select(v => new { v.Id, v.FieldValue })
.FirstOrDefault()

如果在我的数据库中不存在与过滤器关联的记录,则 RealValue 对象设置为 NULL。 虽然我需要 RealValue 是所有属性 ID 零和字段值属性空,如果与过滤器关联的记录不存在。

如何更改上面的查询以使 RealValue 不为 NULL,并且属性 Id 和字段值为零且为空?

试试这个:

int vectorLayerId = 5;
int pointFeatId = 10;
var RealValue = x.VectorLayer_FieldsValue
.Where(f=>f.FeatIdPointFeatures == vectorLayerId && f.VectorLayerFieldsId == pointFeatId)
.Select(v => new { v.Id, v.FieldValue })
.FirstOrDefault() ?? new { Id = 0, FieldValue = "0"};

当 Linq 查询返回 null 时,这将使用 null 合并运算符 (??( 返回具有属性 ID 和字段值(均设置为 0(的匿名类型。

顺便说一下,如果您使用的是 C# 7,您还可以让 Linq 查询创建一个元组而不是匿名类型,如果需要在函数或类似的东西中返回它,这可能会更容易:

int vectorLayerId = 5;
int pointFeatId = 10;
var RealValue = x.VectorLayer_FieldsValue
.Where(f=>f.FeatIdPointFeatures == vectorLayerId && f.VectorLayerFieldsId == pointFeatId)
.Select(v => (v.Id, v.FieldValue))
.FirstOrDefault() ?? (Id: 0, FieldValue: "0");

您可以使用文档中所述的DefaultIfEmpty(defaultVal)方法。

int vectorLayerId = 5;
int pointFeatId = 10;
var RealValue = x.VectorLayer_FieldsValue
.Where(f=>f.FeatIdPointFeatures == vectorLayerId && f.VectorLayerFieldsId == pointFeatId)
.Select(v => new { v.Id, v.FieldValue })
.DefaultIfEmpty(new { 0, "" }).Single(); // assuming that FieldValue is a string

最新更新