我对项目中的实体使用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设置为零,并将FieldValue属性的属性设置为空。
如何更改上面的查询以使RealValue不为NULL,属性Id和FieldValue为零且为空?
答案 0 :(得分:2)
尝试一下:
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和FieldValue(均设置为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");
答案 1 :(得分:1)
您可以使用documentation中所述的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