2016-11-03 5 views
0

エンティティ階層は、顧客>アドレス>連絡先です。だから私は連絡先の詳細を反復するために、このコードを使用します。エンティティフレームワーク:ネストされたエンティティを選択する方法

Contacts CurrentContacts = null; 

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

が、エラー

を投げて、この行CurrentContacts = existingContacts;は暗黙のうちに 'EFTest.Contacts' にタイプ 'System.Collections.Generic.IEnumerable' を変換できません。明示的な変換があります( キャストがありません)

私の間違いは何ですか? existingContactsは連絡先関連データを持ち、CurrentContactsは連絡先タイプの変数です。

ので、私はそれを行うことができる方法を教えてください。

+0

'Contacts'タイプは何ですか?クラスコードを投稿してください。 –

+0

issue sorted .......ありがとうございます – Mou

答えて

0

私は二つの問題を持っていると思うが、Contactsタイプが定義されている方法を見ずに、それはただの推測です。

@Taemyrが指摘するように、Selectの代わりにSelectManyを使用してコレクションのコレクションを平坦化する必要があります。

しかしContactsList<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(); 
関連する問題