я регулярно нахожу такие вещи, как кодированиеПреобразования Ненулевые выражения NULLABLE без жесткого ввода/литье в LINQ запросы
int? min = someQueryable
.Where(x => someCondition)
.Select(x => (int?)x.someNonNullableIntProperty)
.Min();
Это позволяет мне получить нуль вместо «System.ArgumentNullException: значение не может быть null ", когда ничего не соответствует условию. (И я не хочу получать 0
вместо null
.)
Я хотел бы избежать приведения. Это какой-то другой способ, который я пропустил?
Жесткая часть, она должна быть достаточно распространенной, чтобы быть понятной или игнорируемой поставщиками linq. (linq-to-entities и linq-to-nhibernate для моих конкретных потребностей.)
В противном случае я бы добавить некоторые пользовательские AsNullable
расширения для LINQ-к-пи провайдера (который требует некоторой работы), и я не знаю, если EF (6) позволяет сделай это.
Почему я не хочу избегать приведения? Кастинг может остаться незамеченным во время рефакторинга, а затем может вызвать ошибки. И большинство из тех, что я вижу в коде, из-за небрежных разработчиков, не пытаясь запомнить, они могут иметь ненулевое значение от .Value
по типам с нулевым значением, например. (Существует также тройной случай как someCondition ? someIntProperty : (int?)null
но оператор «Элвис» ?.
, вероятно, позволит избежать большинства из них. Это может быть может даже использоваться для моего примера запроса, но это не было бы общим решением.)
Пытается new Nullable<int>(x.someNonNullableIntProperty)
as suggested here не работает с NotSupportedException
(с NH, не проверен с EF). Во всяком случае, это меня не устраивало. В случае более позднего изменения типа свойства он может остаться незамеченным также из-за неявного преобразования. (И пытается new Nullable(x.someNonNullableIntProperty)
не компилируется, общий аргумент типа умозаключения не очень хорошо работает с конструкторами.)
Попытка x.someNonNullableIntProperty as int?
(который до сих пор литые, но менее терпимы о типах несовпадения в этом случае см this here) завершается с ArgumentException
(NH проверено снова, Выражение типа 'System.Int32' не может использоваться как тип 'System.Nullable`1 [System.Int32]' (перевод)).
Если это простой синтаксис метода верхнего уровня 'Select', как в примере, я думаю, что-то можно сделать. Но в целом вы не можете этого сделать. –