#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
типы значений.