2012-08-13 4 views
1

연락처와 목록 간의 EF 코드 첫 번째로 다 대다 관계가 있습니다. 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 속성에 채워진 목록 만 갖습니다. 그래서 이것이 직렬화되어 클라이언트에게 돌아 왔을 때 그 연락처가 속한 다른리스트를 숨 깁니다.

이 방법으로 쿼리가 필터링하는 방식과 전체 목록 집합을 포함하도록 변경하는 방법을 볼 수 없습니다. 어떤 조언을 주시면 감사하겠습니다.

답변

1

당신은 속이고 있습니다! :)

AsQueryable()bulkList.Contacts을 추가하면 컴파일러가 불평하지 않고 Include을 계속 진행할 수 있습니다. 하지만 ...

MSDN on DbExtensions.Include으로 당 : 이러한 방법은을 존재하는 경우

이 확장 방법은 을 된 IQueryable 소스 객체의 포함 (String) 메소드를 호출합니다. 소스 IQueryable에 일치하는 메서드가 없으면이 메서드는 아무 것도 수행하지 않습니다.

(강조 광산)

그리고 EntityCollectionInclude 방법을 가지고 있지 않기 때문에 아무 반응이 없습니다.

당신은 아마과 같이, 첫 번째 문에 포함 목록을 확장해야합니다 :

db.BulkLists 
    .Include(c => c.Contacts.Select(c => c.AddressBookType)) 
    .Include(c => c.Contacts.Select(c => c.BulkLists)) 
+1

놀라운가 둥지 쿼리의 그런으로 생각하지 않았다. 나는 EF 질의가 아마도 실제보다 더 깨지기 쉬운 것으로 생각한다. @ -} - 당신을위한 꽃 : P –

+0

고마워 - 멋진 이모티콘! –

관련 문제