2011-05-16 2 views
5

예를 들어, 엔티티 프레임 워크의 첫 번째 코드를 사용하여 객체의 컨텍스트를 정의 :Entity Framework에서 개체 필터링을 어떻게 수행 할 수 있습니까?

public class DomainContext : DbContext 
{ 
    public DomainContext() { } 
    public virtual DbSet<News> News { get; set; } 
} 

우리 모두는 쿼리 수 있다는 것을 알고 "뉴스"와 같은 일을하고 (예를 들어, 오늘 게시 된 모든 뉴스를 얻을 수 있습니다) :

var ctx = new DomainContext(); 
ctx.News.Where(x => x.PublishedDate == DateTime.Now.Date) 

그러나,이 질문입니다 : ctx.News를 통과하는 모든 쿼리에 미리 정의 된 필터링/조건을 적용 할 수있는 방법이 있나요? ctx.News에 대한 모든 쿼리에서 "게시 된 오늘"필터링이 암시 적으로 적용되기를 원한다고 가정 해보십시오.

+0

'오늘의 뉴스'쿼리의 결과를 반환하는 NewsToday 속성을 추가하지 않는 이유는 무엇입니까? 예 : http://msdn.microsoft.com/en-us/library/bb882532.aspx – Fox32

답변

0

당신은 당신의 상황에 새로운 속성을 추가 할 수 있습니다

public IEnumerable<News> TodaysNews 
{ 
    get 
    { 
     return this.News.Where(x => x.PublishedDate == DateTime.Now.Date); 
    } 
} 

더 이상의 필터링/정렬/등 다음 속성에 적용 할 수 있습니다.

는 업데이트 : 당신은 그냥 미리 필터링 된 쿼리를 사용할 수없는 경우

또 다른 옵션은 데이터베이스의 보기를 만들고 해당보기로 엔티티를 매핑하는 것이다. 보기는 현재 날짜를 기반으로 할 수 있습니다.

+0

맞지만 그게 내가 슬프게도하는 것이 아닙니다. EF 내에서 특정 유형의 모든 개체에 암시 적 쿼리 필터링을 적용 할 수있는 방법이 있습니까? – thr

+0

내 업데이트를 참조하십시오. 어쩌면 엔티티 매핑을 사용하여 상황에 맞는 뷰를 만들 수 있습니다. – Jacob

2

내가 제안하는대로 DbSet<News> 개체에 필터를 추가하는 방법이 있다고 생각하지 않습니다. 하지만 또 다른 함수를 작성한다 할 수 있어야 무엇을 : 다음

public virtual IEnumerable<News> TodaysNews 
{ 
    get { return News.WHere(n => n.PublishDate == DateTime.Today); } 
} 

과, 생각, 당신은 같은 다른 어딘가의 상단에 쿼리 한 경우 : 다음

var todaysGoodNews = from n in ctx.TodaysNews 
        where n.IsGood == true 
        select n; 

그것을 두 개의 별도 쿼리를 작성하는 대신 서버로 보낼 때 쿼리를 결합합니다. 내가 IEnumerable<>을 사용할 때 또는 다른 것을 돌려 줄 필요가있는 경우 (예 : IQueryable<>?) 작동한다면 긍정적이지 않습니다.

편집 :

난 그냥 아래의 다른 포스터에 응답을 보았다. 내가 입력/형식을 너무 오래 걸렸을 것 같아요. 나는 그런 필터를 적용 할 방법을 모르지만, 우리의 솔루션이 효과적으로 그렇게하지 못하고 있습니까? TodaysNews를 문맥이나 다른 것을 통해 그 객체에 직접 접근하는 유일한 방법으로 만들 수도 있습니다.

+0

글쎄, 그것은 일종의 일이다. 하지만 좀 더 복잡해지기 때문에 나머지 응용 프로그램에서 정상적인 "뉴스"를 자동으로 숨길 수 있기를 원합니다.이 응용 프로그램은 하나의 특정 응용 프로그램이 아니라 재사용되는 일반적인 솔루션입니다. 기본적으로 라이브러리 와이드). – thr

3

뉴스를 쿼리하는 데 자동 조건 (필터)을 추가 할 방법이 없습니다. 모든 게시 된 예제는 News을 직접 쿼리하는 경우에만 작동합니다. 예를 들어 News을 가리키는 탐색 속성을로드하는 경우 예제가 실패합니다.

EDMX가 conditional mapping으로 해결하지만 다른 매우 불리한 단점이 있습니다. 조건부 매핑은 고정되어 있으며 (모델을 다시 작성하지 않고는 변경할 수 없음) 각 유형에 대해 단일 조건 만 가질 수 있습니다. 이는 단일 엔티티 유형으로 저하 된 TPH와 같습니다. 조건부 매핑에서 정의 된 조건은 "오늘"과 함께 작동하지 않을 수 있습니다. 조건부 매핑은 코드 우선 접근 방식에서 사용할 수 없습니다.

0

나는 동일한 문제에 직면하고 있으며 이것을 발견했다 : EntityFramework.Filters. This post에 사용 방법이 나와 있습니다.

+0

EntityFramework.Filters 라이브러리에는 필터 값 수명주기에 몇 가지 문제가 있습니다 (문제 섹션 참조). EntityFramework.DynamicFilters (https://github.com/jcachat/EntityFramework.DynamicFilters)에는 이러한 문제가 없지만 FK를 엔터티 클래스의 속성으로 모델링해야합니다. – bloparod

관련 문제