2010-06-22 3 views
1

자체적으로 Message.ID == Message.Parent에 조인하는 메시지 테이블이 있습니다. 그래서 나는 여러 개의 ChildMessages와 함께 1 개의 Message를 가지고있다. 이것은 네비게이션 속성으로 멋지게 설정됩니다.엔티티에 Linq에 대한 제한이 포함됩니다.

코드는 현재 :

정말에만 활성 ChildMessages의 모든과 (즉 특정 ID와이 isActive 동일) 1 메시지를 반환하는 것입니다 원하는 것은
var message = from m in soe.Messages.Include("ChildMessages") 
       where m.ID == id 
       && m.IsActive 
       select m; 
return message.FirstOrDefault(); 

나는 그것을하고 싶은 하나의 데이터베이스 호출.

답변

0

결론이 작업은 Entity 프레임 워크에서 가능하지 않습니다.

제약 조건을 충족시키는 익명 형식을 반환하는 것이 좋습니다. 예 :

var message = from m in soe.Messages 
       where m.ID == id 
       && m.IsActive 
       select 
        new 
        { 
         Message = m, 
         ChildMessages = m.ChildMessages.Where(c => c.IsActive) 
        }; 
return message.FirstOrDefault() 
1

4.0 용 솔루션이 있습니다 (3.5에서 작동하는지 확실하지 않습니다. 확인하지 않았습니다).

먼저 엔티티 모델 Lazy Loading Enabled 속성을 false으로 설정하십시오. 결과적으로 자동로드되는 참조가 손실됩니다.

다음으로,이 코드를 시도해보십시오 EF는 부모 - 자식 참조를 해결할 수

var message = soe.Messages 
    .Where(m => (m.ID == id || m.ParentId == id) && m.IsActive) 
    .AsEnumerable() 
    .FirstOrDefault(e => e.Id == id); 

, 그리고 명시 적 요청 (Include 또는 Load 등) 할 경우가 아니면 다른 하위 참조를로드 할 수 없습니다. 결과를 AsEnumerable을 사용하여 반복해야합니다. 그렇지 않으면로드되지 않습니다.

+0

그러나 이는 하위 메시지에 제약 조건을 두지 않습니다. 나는 m.ChildMessages.IsActive와 같은 것을 넣고 싶다. 하지만 ChildMessages는 컬렉션이므로 작동하지 않습니다. – BritishDeveloper

+0

오, 이제 알겠습니다. 그것은 훌륭한 질문입니다. 내 새로운 대답을 확인하십시오. – HuBeZa

+0

비록 ChildMessages가 채워지 길 원합니다 (그러나 활성 자식 만). 방법에 의해 당신의 도움을 주셔서 감사합니다 – BritishDeveloper