Как я могу изменить запрос, чтобы результат не был равен NULL - PullRequest
0 голосов
/ 15 октября 2018

Я использую 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 все свойства были равны нулю, а свойство FieldValue - пустым, если запись, связанная с фильтром, не существует.

Как изменить приведенный выше запрос, чтобы RealValue не был равен NULL, а свойства Id и FieldValueноль и пусто?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вы можете использовать метод 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
0 голосов
/ 15 октября 2018

Попробуйте это:

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"};

При этом используется оператор объединения нулей (??) для возврата анонимного типа со свойством Id и FieldValue (оба установлены в 0), когда запрос Linq возвращает ноль.

Кстати, если вы используете 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");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...