Причина получения исключения заключается в том, что вы загружаете все PushQueues в память, а затем пытаетесь применить свой предикат: x => x.User.ID == user.ID
, и потому что отложенная загрузка НЕ включенапо вашему коду x.User
загружаться не будет, поэтому создается исключение.Вы не пометили свойство навигации пользователя как virtual , поэтому оно не включило EF Lazy Loading.Когда вы развертываете его в режиме отладки в VS, вы явно загружаете его, но во время выполнения он загружается не лениво, и поэтому вы видите, что он заполняется при расширении.
Чтобы исправить это, вам нужно изменить сигнатуру вашего метода Select, так как это основная проблема: вы передаете Func<T, bool>
, тогда как вместо этого необходимо указать Expression<Func<T, bool>>
.По сути, вы хотите, чтобы ваш предикат выполнялся в хранилище данных, а не в памяти, поэтому вам нужно изменить код так:
public IEnumerable<T> Select(Expression<Func<T, bool>> predicate)
{
return objectSet.Where(predicate);
}
Конечно, в качестве альтернативы вы можете оставить метод выбора таким, какой он есть сейчас, ивключите отложенную загрузку, таким образом, исключение NullReferenceException исчезнет, но это приведет к ужасной производительности во время выполнения, так как EF будет пытаться загружать User на каждый отдельный объект PushQueue, а затем применять свой предикат: