2010-12-15 3 views
0

나는 쿼리 수준이 아닌 모델 수준에서 일부 엔티티 집합을 필터링하려는 시나리오가 있습니다. 즉, 기본적으로 필터링을 내 모델에 '하드 코딩'하고 싶습니다. 엔티티 집합에 대한 모든 쿼리에서 항상 동일한 Where 메서드 필터링을 반복하지 않아도됩니다. 더 구체적으로 말하자면, CampaignTypes 엔티티 집합이 있고 데이터 모델에서 나는 특정 비즈니스 영역에 속한 캠페인 유형 만 원하고 있습니다. 낮은 수준의 필터링을 사용하지 않으면 검색 할 때마다 CampaignTypes을 쿼리 할 때마다 CampaignTypes.Where(ct => ct.BusinessArea == BusinessAreas.Outdoor)을 사용해야합니다. DB 뷰를 생성하고이를 내 모델에서 대신 사용하는 반복 필터링을 피하려면 어떻게해야합니까?필터링 엔티티가 데이터 모델 수준에서 설정됩니다.

답변

0
public IQueryable<CampaignType> getCampaignTypes() 
{ 
    using (var context = new TestEntities()) 
    { 
     var campaignTypes = context.CampaignTypes. 
      Where(ct => ct.BusinessArea == BusinessAreas.Outdoor). 
      AsQueryable<CampaignTypes>(); 
     return campaignTypes; 
    } 
} 

사용하여이 방법의 결과 대신에 직접 액세스의 콘텍스트. "AsQueryable"메서드를 "AsList"등으로 변경하여 목록을 반환하거나 설정하는 등의 쿼리를 수정할 수도 있습니다.

+0

한 가지 팁 : 저는 EF 쿼리를 위해 'using'블록을 사용하지 않는 방법을 배웠습니다. 클라이언트가 아직로드되지 않은 탐색 속성에 액세스하려고하면 EF가이를로드하고 이미 삭제 된 컨텍스트를 찾고 무례한 예외를 던지기 때문에 지연로드가 발생합니다. – ProfK

+0

고마워, ProfK. 나는 게으른 로딩을 많이 사용하므로 이것을 인식하지 못했습니다. 오늘 저녁 (직장에서) 자세히 살펴보고 내 대답을 삭제하거나 수정해야하는지 알아 봅니다. –

1

필터와 엔티티 집합에 대해 걱정할 필요가없는 코드 사이에 다른 계층 (논리 계층)을 추가 할 수 있습니다. 이 레이어는 IQuerable 등을 반환 할 수 있으며 필터를 엔터티 집합에 적용하고 결과를 반환합니다.

그런 식으로 응용 프로그램의 다른 부분은이 필터를 적용하는 것에 대해 걱정할 필요가 없으며 데이터베이스에 대해 실행중인 단일 쿼리 (대부분의 경우)입니다.

+0

예, 이전에 내 서비스 레이어에서이 작업을 수행 했었지만 그저 궁금 해서요. 어떤 '가까운 금속'접근에 관해서. – ProfK

+0

있을 수 있습니다. 코드를 다시 생성하자마자 덮어 쓴 것이므로 생성 된 코드를 변경하는 것을 피할 수 있습니다. 비록 간단한 애플리케이션이라 할지라도 중간 계층은 얇은 논리적 계층이라 할지라도 일반적으로 어느 시점에서 필요하기 때문에 필요합니다. –

1

다른 파일에 다른 이름으로 다른 속성을 만들 수 있습니다. 모델의 기본 부분 클래스를 확장합니다.

EDIT :

namespace YourNameSpace 
{ 
    using System.Data.Objects; 

    public partial class SomeModelEntities 
    { 
     public ObjectSet<CampaignType> FilteredCampaignTypes 
     { 
      get 
      { 
       if ((_CampaignType == null)) 
       { 
        _CampaignType = base.CreateObjectSet<CampaignType>("CampaignType"); 
       } 
       return _CampaignType.Where(ct => ct.BusinessArea == BusinessAreas.Outdoor); 
      } 
     } 
    } 
} 
+0

"다른 파일에 다른 이름으로 복제"하는 것이 무슨 뜻인지 잘 모르겠지만 특히 초기 모델에서는 생성 된 코드를 변경하는 것을 싫어합니다. 모델을 아주 자주 다시 생성합니다. – ProfK