2016-11-03 2 views
0

моя иерархия объектов - это Customer> Address> Contact. поэтому я использую этот код для итерации в контактных данных.Entity Framework: как выбрать вложенный объект

Contacts CurrentContacts = null; 

foreach (var existingContacts in existingCustomer.Addresses.Select(a => a.Contacts.Where(cc=> cc.ContactID==5))) 
{ 
    CurrentContacts = existingContacts; 
} 

, но эта линия CurrentContacts = existingContacts; бросает ошибку

Не удается неявно преобразовать тип 'System.Collections.Generic.IEnumerable' в 'EFTest.Contacts'. Явное преобразование существует (вам не хватает литых?)

какая у меня ошибка. existingContacts будет иметь контактные данные, а CurrentContacts - это переменная типа контакта.

, так что скажите, пожалуйста, как я могу это сделать.

+0

Что такое 'типа Contacts'? Можете ли вы отправить код класса? –

+0

вопрос отсортирован ....... спасибо все – Mou

ответ

0

Я думаю, что у вас есть две проблемы, но, не видя, как Contacts тип определяется это только предположение.

Как указывает @Taemyr, вы должны использовать SelectMany вместо Select, чтобы сгладить коллекцию коллекций.

Но если Contacts наследуется от List<EFTest.Contacts> вы еще не собираетесь быть в состоянии выполнить задание, вам необходимо изменить переменную декларацию:

IEnumerable<Contacts> CurrentContacts = null; 
+1

Это неверно. Если 'Adress.Contacts' имеет тип' IEnumerable '' Customer.Adresses.SelectMany (a => a.Contacts) 'будет' IEnumerable 'и отдельными элементами, которые вы получаете в' foreach', будет «Контакты» – Taemyr

0

Использовать SelectMany вместо Select.

Select проектирует каждый отдельный элемент и ничего не делает для остальной части перечислимого . Таким образом, Addresses.Select(a=>a.Contacts.Where(...)) является перечислимым из всех Address.Contacts.Where(...). То есть. вы получаете перечислимые числа.

Чтобы получить один список, вам необходимо свернуть этот список. Это то, что делает SelectMany.

Это говорит даже

foreach (var existingContacts in <some enumerable>) 
{ 
    CurrentContacts = existingContacts; 
} 

выглядит странно. Если в цикле нет другой логики, вы можете заменить цикл;

CurrentContacts= <some enumerable>.LastOrDefault(); 

И если вы действительно не заботитесь о том, какой контакт вы используете, если у него есть ContactID = 5;

CurrentContacts= <some enumerable>.FirstOrDefault(); 
Смежные вопросы