1

EF Code First では、連絡先とリストの間に多対多の関係があります。ProxyCreation と LazyLoading を無効にして、エンティティのシリアル化を許可します。

特定のリストにある連絡先を返すためのクエリがあります。

// GET api/Contacts
        [Queryable]
        public IQueryable<Contact> GetContacts(int bulkListId)
        {
            var bulkList = db.BulkLists.Include(c => c.Contacts).Where(c => c.ID == bulkListId).SingleOrDefault();

            if (bulkList == null)
                throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));

            return bulkList.Contacts.AsQueryable().OrderBy(c => c.ID).Include(c => c.AddressBookType).Include(c => c.BulkLists);
        }

これは機能しますが、意図したとおりには機能しません。これにより、特定のリストにある連絡先の正しいセットが得られますが、これらの連絡先には、関係の Lists プロパティに入力されたリストしかありません。したがって、これがシリアル化されてクライアントに返されると、連絡先がメンバーである他のリストが非表示になります。

この方法でクエリがどのようにフィルター処理されているのか、またリストの完全なセットを含めるように変更する方法がわかりません。アドバイスをいただければ幸いです。

4

1 に答える 1

1

あなたは浮気している!:)

追加AsQueryable()することで、コンパイラに文句を言わずbulkList.Contactsに続行できるようになります。Includeしかし...

DbExtensions.Include のMSDN によると:

この拡張メソッドは、IQueryable ソース オブジェクトの Include(String) メソッドが存在する場合、そのメソッドを呼び出します。ソース IQueryable に一致するメソッドがない場合、このメソッドは何もしません。

(私のものを強調)

EntityCollectionメソッドがないため、Include何も起こりません。

おそらく次のように、最初のステートメントでインクルード リストを展開する必要があります。

db.BulkLists
    .Include(c => c.Contacts.Select(c => c.AddressBookType))
    .Include(c => c.Contacts.Select(c => c.BulkLists))
于 2012-08-13T14:13:28.603 に答える