2012-01-23 4 views
0

Entityframework 모델에서 유형/테이블 "ElementToComponentMapping"에 연결된 형식/테이블 "ModelElement"가 있습니다. 내비게이션/외래 키는 "ModelID"및 "ElementNo"입니다.EntityFramework/LINQ - 연결된 테이블/형식에서 필터링 된 콘텐츠 가져 오기

ModelElement 인스턴스에 연결된 ElementToComponentMapping의 내용도 포함되어있는 특정 필터링 조건을 기반으로 ModelElement의 인스턴스를 반환하는 메서드를 작성해야합니다. 문제는 필자가 ElementToComponentMapping에서 반환 한 것을 필터링해야한다는 것입니다. 즉, 사용할 수없는 것처럼 보입니다. 포함 포함

이렇게 포함되지 않습니다. 포함/내 두 번째 시도는 별도로 관련 "ElementToComponentMappings"을 조회 한 후, 먼저 주 "ModelElement"개체를 쿼리, 그리고 설정

public ModelElement GetModelElement(int modelID, int modelElementNo, int version) 
{ 
    return (from c in context.ModelElements.Include("ElementToComponentMapping") 
      where c.ModelID == modelID && c.ElementNo == modelElementNo 
       && c.ElementToComponentMappings.Where(m => m.version == version) 
        select c).FirstOrDefault(); 
} 

where 절에서 탐색 유형 그 "ModelElement"

의 속성으로
public ModelElement GetModelElement(int modelID, int modelElementNo, int version) 
{ 
ModelElement newElement = (from c in context.ModelElements 
        where c.ModelID == modelID && c.ElementNo == modelElementNo 
        select c).FirstOrDefault(); 
newElement.ElementToComponentMappings = 
         (from m in context.ElementToComponentMappings 
          where m.ModelID == modelID 
          && m.ElementNo == modelElementNo 
          && m.version == version 
           select m).FirstOrDefault(); 
return newElement; 
} 

하지만 이것도 "ElementToComponentMappings"개체를 직접 쿼리하여 반환 된 형식이 "ModelElement"개체의 "ElementToComponentMappings"속성과 다릅니다.

이것은 간단한 조작처럼 보입니다 - 외래 키 연결된 테이블의 값을 얻습니다. 여기서 FK 테이블의 내용에서 어떤 것을 필터링 할 수 있습니까?

답변

1

newElement.ElementToComponentMappings이 (가) 수집되었지만 쿼리가 단일 인스턴스 만 반환하기 때문에 유형이 다릅니다.

당신이 사용하려고 할 수 있습니다

context.ContextOptions.LazyLoadingEnabled = false; 
var newElement = (from c in context.ModelElements 
        where c.ModelID == modelID && c.ElementNo == modelElementNo 
        select c).FirstOrDefault(); 

var mapping = (from m in context.ElementToComponentMappings 
       where m.ModelID == modelID 
        && m.ElementNo == modelElementNo 
        && m.version == version 
       select m).FirstOrDefault(); 

// now check if newElement.ElementToComponentMappings contains your single item 

당신은이를 사용하려고 할 수 있습니다

당신의 유형은 프록시하고 게으른 로딩이 있기 때문에 사용하는 경우 이러한 방법 중 어느 것도 작동
context.ContextOptions.LazyLoadingEnabled = false; 
var newElement = (from c in context.ModelElements 
        where c.ModelID == modelID && c.ElementNo == modelElementNo 
        select c).FirstOrDefault(); 

((EntityCollection<ElementToComponentMappings>)newElement.ElementToComponentMappings) 
    .CreateSourceQuery() 
    .FirstOrDefault(m.version == version); // You don't need to check FKs here 

// now check if newElement.ElementToComponentMappings contains your single item 

예상되는 자동 관계 픽스 업은 탐색 속성을로드 된 것으로 표시하지 않습니다 (지연로드가 활성화 된 경우 속성에 대한 다음 액세스는 지연로드를 유발하고 다른 모든 엔티티를로드합니다).

+0

입력 해 주셔서 감사합니다. 아쉽게도 아직 없습니다. 첫 번째 제안에서 newElement.ElementToComponentMappings 속성은 어디에 설정됩니까? 두 번째 제안에서 ElementToComponentMappings에 FirstOrDefault에 대한 정의가 포함되어 있지 않고 가장 좋은 확장 메서드 오버로드에 잘못된 인수가 있다는 오류가 발생합니다. 유형 차이에 관해서는, 당신은 바로 ElementToComponentMappings가 콜렉션이라는 것입니다. 그것은 어떤 점에서 대신 ToList를 호출해야한다는 것을 의미합니까? –

+0

첫 번째 경우에는 트릭입니다. 모든 것이 올바르게 구성 되었다면 해당 속성을 설정할 필요가 없습니다. 자동으로 채워 져야합니다. 두 번째 경우에는 이상합니다. 'CreateSourceQuery'는'IQueryable'의 구현 인'ObjectQuery'를 리턴하고'FirstOrDefault'를 제공합니다. 'ToList'를 사용하는 방법은 엔티티가 프록시되지 않은 경우에만 작동합니다. 그렇지 않으면 새 컬렉션을 탐색 속성에 할당 할 수 없다는 오류가 발생합니다. 유용한 팁, 요령 및 통찰력을 얻으려면 –

+0

+1. 결국 나는이 접근법을 작동시킬 수 없었고, 다른 방식으로도 그렇게했습니다. –