2010-02-03 4 views
2

저장소 리팩토링을 고려 중입니다. 유연성을 높이고 메소드 수를 줄여야합니다.필터링을 위해 linq 표현식을 사용하는 저장소

다음과 같은 방법이 있습니다

:

ICollection GetUsers(Expression e) 
{ 
    //retrieve user collection from store 
    //apply expression to collection and return 
} 

이 합리적인 접근 방식 :

Collection GetAllUsersByRole(Role role) 
User GetUserByuserName(string userName) 

... 나는 하나의 방법 A의 LINQ 표현을 복용하고 싶은가? 아마도 하드 코딩 된 기준에 따라 사용자의 하위 집합을 검색하기보다는 전체 사용자 컬렉션을 검색하고 필터링해야하기 때문에 효율성이 떨어질 것입니다.

편집 : NHibernate 내 구현에 ORM을 제공합니다.

답변

3

정말 Expression을 해당 메소드의 인수로 사용하려고합니다.

성능면에서 볼 때 실제로 얼마나 멀리 가고 싶은지에 달려 있습니다. 가장 간단한 방법은 모든 객체를 메모리에 가져온 다음 술어 표현식으로 필터링하는 것입니다.

반면에, 당신은 어떤 종류의 기준을 언급합니다. 백 엔드 데이터 시스템이 무엇인지 전혀 모르겠지만 이러한 통과 필터를 사용하여 기준으로 변환 할 수 있습니다. 이것은 본질적으로 Linq to SQL과 Linq to Entities가하는 일이지만, 지원해야 할 가능성의 범위가 현저히 작기를 바랍니다. 그렇지 않은 경우이 접근 방식을 사용하려면 ORM 도구 중 하나로 전환하는 것이 좋습니다.

+0

"가장 간단한 방법은 모든 개체를 메모리에 가져 와서 조건부 식으로 필터링하는 것입니다." Thats는 좋은 점으로,이 클래스는 다른 로직에 대한 번역자가 될 수 있지만 노출 된 메소드의 수를 더 작게 만듭니다. –

1

매우 합리적인 방법은 아니기 때문에 일반적으로 많은 성능 문제가 발생할 수 있습니다. LINQ 쿼리를 수락하는 데이터 액세스 기술을 사용하는 경우이 쿼리 (식) 만 사용하면됩니다. EntityFramework에 대해 IQueryable LINQ to SQL 또는 ObjectQuery 일 수 있습니다. 또한 nHibernate에 대한 ICriteria (linq 지원 제외) 일 수 있습니다. 모든 최신 ORM 도구에는 고유 한 표현식 API가 있으므로 사용하기 만하면됩니다. 맞춤 데이터 액세스 레이어가있는 경우 criterias를 만들기위한 API를 직접 작성해야합니다 (예 : Query Object).

+0

우리는 NHibernate를 사용하기 때문에 표현식 대신 ICriteria 객체를 제공해야합니까? 그렇다면 람다 식을 사용할 수 없게되어 실망 할 것입니다. – Ben

+1

@Ben Aston, NHibernate는 완전한 기능을 갖춘 Linq 공급자 (http://sourceforge.net/projects/nhibernate/files/)를 만들기 시작했습니다. 그러나 현재 지원 수준이 무엇인지 알지 못합니다. 내 응답에서 언급했듯이 필터 표현식을 Hibernate Criteria로 변환 할 수 있지만 이런 식으로 실행할 수있는 쿼리의 종류를 제한 할 수 있습니다 (예 : 속성과 상수의 단순한 동일성은 쉽습니다). –

관련 문제