Entity Framework 6 — Получить значение null вместо значения по умолчанию, если запрос не содержит строк

#linq #entity-framework #lambda

#linq #сущность-фреймворк #лямбда — выражение

Вопрос:

Сущность Foo:

public int Foo { get; set; }

EF-Запрос:

 int? barX = FOOs.GetQuery().Where(f => f.x == x).Select(f => f.bar).SingleOrDefault();
 

Возвращает значение по умолчанию 0 для целого числа, если нет строк where f.x == x , но я хочу вернуть null .

Как этого добиться?

0 не является четким показателем, был ли результат пустым или значение столбцов действительно равно 0!

Ответ №1:

Вместо выполнения проекции в запросе вы можете вернуть полный объект и проект после:

 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, поскольку я не знал, что это возможно (просто приведите его в проекции):

 int? barX = FOOs.GetQuery().Where(f => f.x == x).Select(f => (int?)f.bar).SingleOrDefault();
 

Комментарии:

1. это допустимый обходной путь, но я не хочу извлекать всю сущность, если это возможно

2. Из исходного фрагмента OP, не следует .Select(f => (int?) f.bar).SingleOrDefault() ли устранить проблему? Кажется более лаконичным подходом, чем добавление дополнительной оценки в код.

3. @Flater Ну конечно, если вам нужен простой код. =) Я снова отредактировал ответ по вашему предложению, но не стесняйтесь публиковать ответ самостоятельно, и я удалю редактирование.

4. Спасибо тебе @Flater. Тем не менее, я думаю, что это большая проблема в EF!

5. @djmj: Честно говоря, int просто не может быть нулевым. Дело не в том, что EF не хочет возвращать значение null, а в том, что язык не поддерживает null типы значений.