2009-09-29 5 views
1

일반 저장소를 사용하여 일부 데이터 액세스를 표준화하려고합니다. 내가 원하는 것은 내 엔터티의 기본 필드를 나타내는 인터페이스에 정의 된 함수를 가질 수 있으므로 결과를 필터링하는 데 사용할 수 있습니다. 이것은 Linq-To-SQL로 컴파일 할 수 있어야합니다.where 절에 일반 저장소 엔티티와 함께 ​​사용하는 linq 함수

interface IEntity { 
    Expression<func<bool>> FilterQuery(string filter) 
} 

partial class AnEntity : IEntity 
{ 
    public string AName {get; set;} 

    Expression<func<bool>> FilterQuery(string filter) 
    { 
    return AName.Contains(filter); 
    } 
} 

class List<T> : where T : class, IEntity 
{ 
    private IQueryable<T> items; 
    public IQueryable<T> show(string filter) 
    { 
    items = items.Where(AN => AN.FilterQuery(filter)); 
    return items; 
    } 
} 

그러나, 나는 일반적으로 같은 오류를 얻을 :

이 대리자 형식에 람다 식을 변환 할 수 없습니다를 'System.Func<T,int,bool>' 블록 의 반환 형식 중 일부는에 암시 적으로 변환하지 않기 때문에 대리자 반환 유형

내 목표를 달성하는 가장 좋은 방법은 무엇입니까? 뭔가 linq에서 SQL where 절에 사용할 수있는 엔티티에 정의 된 일반?

+0

이것은 물건을 이동하는 이상한 방법입니다. 일반적으로 엔티티를 "필터링"하지 않으려면 리포지토리에 필터 방법을 넣거나 엔티티에 대한 강력한 유형의 콜렉션. 나는 당신이 콜렉션 내의 각 엔티티가 어떤 기준에 부합하는지 말할 방법을 제공하기를 원한다고 가정하지만, 그 엔티티 외부에 그 로직을 두어 엔티티 위에 * 작동 시키도록 할 수도있다. 실재. –

+0

아 ... 마크 Gravell 이미 지적했다. 나는 또한 당신이 이것에 대해 갈 극한의 * 좋은 이유가 필요할 것이라고 지적하고 싶다. 대부분의 지속성 프레임 워크는 이러한 유형의 메커니즘을 제공하고 간접적 인 또 다른 계층이 큰 이익을 가져야하기 때문에 스스로를 다시 구현한다. 비용. –

+0

안녕하세요, 모든 의견을 제공해 주셔서 감사합니다. 나는 이것이 잘못된 길로 가고 있다는 것을 알 수있다. 필자가 원하는 것은 엔터티가 필터링에 참여하는 list 메서드에 플래그를 지정하고 해당 필드를 필터링하는 것입니다. 그러나 모든 것이 일반적이기 때문에 list 메소드는 해당 필드의 이름을 알지 못합니다 (다른 엔티티 유형간에 변경됨). – stew

답변

1

Where의 람다는 엔티티 유형을 사용해야합니다. 나는 당신이 필요로 할 것이라고 기대할 것입니다 :

interface IEntity<T> where T : class { 
    Expression<Func<T, bool>> FilterQuery(string filter); 
} 

partial class AnEntity : IEntity<AnEntity> 
{ 
    public string AName {get; set;} 

    Expression<Func<AnEntity,bool>> IEntity<AnEntity>.FilterQuery(string filter) 
    { 
    return x => x.AName.Contains(filter); 
    } 
} 

그러나; FilterQuery 방법은 엔터티 책임감을 느끼지 않습니다 ... (우려 사항 분리); 이것이 "목록"사건에서 도움이되지 않는 이유입니다. 아마 그걸 목록으로 옮길 필요가 있을까요? 하지만 작동 할 때 :

T template = new T(); // this is a horrible way to get the filter!!! 
         // and illustrates that this method doesn't belong on 
         // this type; only done this way to fit the question's 
         // pretext - which I believe is... suboptimal. 
var filterQuery = template.FilterQuery(filter); 
items = items.Where(filterQuery); 
+0

고마워요 마크 ... 좋은 해결책이긴하지만 '차선책'에 대해 무슨 뜻인지 알 겠어 ... 질문을 수정하고 더 좋은 방법을 얻을 수 있는지 내가 원하는. – stew

+0

저는 역할에 대해서만 이야기하고 있습니다. A 유형의 * instances *를 필터링하는 메소드는 실제로 A 유형의 인스턴스 메소드로 잘 앉지 않습니다. 유형에 대한 저장소 나 * 유형에 대한 * 정적 * 메소드로 작동합니다 (그러나 정적 메소드는 ' 물론 인터페이스에 참여하는 것). –

+0

그래, 나는 정적 방법을 선호했을거야 ...하지만 당신이 설명하는 정확한 이유에 대한 하나를 사용할 수 없습니다. – stew

관련 문제