Когда запрос EF Core LINQ приводит к объединению нулей, несмотря на то, что SingleOrDefault () возвращает нуль? - PullRequest
0 голосов
/ 29 апреля 2020

У меня запрос к DbContext что-то вроде:

ctx.Items.SingleOrDefault(i => i.Id == *someQueryThatReturns0*).Code

someQueryThatReturns0 - это запрос, который ищет Id, что-то вроде следующего:

otherItems.Where(h => h.Id == xyz).Select(s => s.OtherId).SingleOrDefault()

Когда этот внутренний запрос не имеет результатов, тогда внутренний SingleOrDefault вернет 0, потому что идентификаторы являются int, и это означает, что внешний Items.SingleOrDefault(..) должен привести к нулю.

Но при обращении к Items.SingleOrDefault(..).Code вместо получения Исключение NullRef, оно будет просто нулевым.

Все это является частью большого запроса, в котором он используется для установки значений в Select (), что-то вроде:

someComplexQuery.Select(x => new someDto(){
  ...
  someProp = x.Valid ? ctx.Items.SingleOrDefault(i => i.Id == *someQueryThatReturns0*).Code : null;
  ...
})

При выполнении запроса я бы ожидал исключение NullRef, но вместо этого someProp просто объединяется в null в основном. Является ли это ожидаемым поведением просто потому, что ссылка на .Code в запросе, подобном этому, будет как-то переведена в запрос SQL? Или я что-то здесь упускаю?

1 Ответ

0 голосов
/ 29 апреля 2020
  someProp = x.Valid ? ctx.Items.SingleOrDefault(i => i.Id == *someQueryThatReturns0*).Code : null;

Эта строка обязательно должна возвращать ноль в SingleOrDefault, если объект Item является классом, и, следовательно, выдавать исключение NullReferenceException.

Если это тип структуры, тогда она инициализирует структуру со всеми ее значениями. в свою очередь инициализируется значение по умолчанию (т. е. ноль, ноль, и т. д. c.).

Если предположить, что это класс, единственный способ, которым someProp будет в конечном итоге установлено значение null, - это если коллекция Items имеет элемент с Id, равным нулю, и его Code свойство установлено в null, или если x.Valid установлено в false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...