#linq #asp.net-core
#linq #asp.сетевое ядро
Вопрос:
Впервые за долгое время работаю с LINQ и пытаюсь что-то исправить. У меня есть следующие заявления:
var element = await _Entities.References .Where(db =gt; db.LoadId == request.LoadId amp;amp; db.ReferenceCode == "123") .OrderByDescending(rec =gt; rec.Created).FirstOrDefaultAsync(cancellationToken); if (element != null) { dto.ElementValue = element.Value; }
Я хотел бы сжать это в один оператор, если это возможно, но у меня возникли проблемы с получением только значения из метода await.
Ответ №1:
Вы могли бы сделать что-то вроде этого:
dto.ElementValue = (await _Entity.References .Where(db =gt; db.LoadId == request.LoadId amp;amp; db.ReferenceCode == "123") .OrderByDescending(rec =gt; rec.Created) .FirstOrDefaultAsync(cancellationToken))?.Value ?? dto.ElementValue;
Обратите внимание, что технически это изменяет поведение кода. Ранее, если запрос не возвращает результат, ElementValue
свойство не затрагивается. С помощью однострочного, если запрос не возвращает результат, ElementValue
будут вызваны как геттер, так и сеттер.
Кроме того, если запрос возвращает результат , значение которого Value
равно null
, ElementValue
свойство будет установлено само по себе, а не null
.