У меня есть следующий бит кода:
Expression<Func<Subscription, Service>> service2= subscription => (from relationship in subscription.ChildRelationships
select relationship.SecondService).FirstOrDefault();
Создает выражение, которое я могу использовать позже как часть запроса со структурой сущностей. Фактический код, который я использую, имеет предложение where, но я опускаю его для удобства чтения. Это отлично работает, и я могу запустить его в LINQPad, который я использую для тестирования.
Если я изменю код на:
Expression<Func<Subscription, IQueryable<Service>>> service2= subscription => (from relationship in subscription.ChildRelationships
select relationship.SecondService);
Больше не компилируется и имеет следующую ошибку:
Невозможно преобразовать лямбда-выражение в
тип делегата
'System.Func >'
потому что некоторые из возвращаемых типов в
блок не является неявным
обратимый к возвращению делегата
тип
Похоже, потому что ChildRelationships, который является свойством навигации, не реализует IQueryable. На самом деле он имеет тип EntityCollection, который реализует IEnumerable, но не подходит для создания выражений, работающих с EF.
Мне кажется, я понимаю, почему второй блок кода не работает, и хотел бы знать, как его переписать, чтобы он работал. Меня также озадачивает, почему первый блок кода работает. Он также использует свойство навигации ChildRelationships, но без проблем становится выражением, которое работает с EF.
Может ли кто-нибудь пролить свет?