2011-03-16 5 views
1

일부 클라이언트의 경우 데이터 액세스 계층에 사용할 클래스 집합이 있습니다. 나는 필터의 집합을 허용하고 데이터 액세스의 부분은이 형식으로 전송하기 :필터 문자열을 C# 대리자로 변환

"{Member[.Member....]}{Operator}{Value}" 
나는이 같은 LINQ 쿼리에 사용하기 위해 대표로 이러한 문자열을 설정하고자하는

:

.Where([delegate returned by a factory]) 
parent => parent.Child.Id == 5

:

IEnumerable<Parent> parents = GetSomeParents(); 
string filter = "Child.Id=5"; 
var expression = FilterFactory<Parent>.GetExpression(filter); 

parents = parents.Where(expression); 

표현 대리인 포함됩니다 : 여기

는보다 구체적인 예이다

리플렉션을 사용하여 보내는 모든 멤버 경로를 처리하는 일반적인 방법으로 FilterFactory를 구성하는 방법이 있습니까? 색인 생성을위한 경로는 필수는 아니지만 좋을 것입니다.

답변

4

예! 이것은 너무 재미있는 일입니다.

이것을 할 수있는 한 가지 방법은 LINQ Dynamic Query Library을 사용하고 거기에있는 표현식 컴파일러를 가져 오는 것입니다. 나는 또한 내 프로젝트에서 매우 비슷한 것을 가지고있다. MetaSharp.

구문이나 기능이 원하는 내용과 일치하지 않는 경우 직접 처리 할 수도 있습니다. 일반적인 생각은 문자열을 구문 분석하고 파싱중인 내용을 나타내는 Expression 트리를 작성해야한다는 것입니다. .NET에서 표현 트리 객체는 System.Linq.Expressions에 있습니다. 일단 당신이 당신의 나무를 가지고 있다면 당신은 그 나무에 대해 Compile()을 호출 할 수 있습니다. 그러면 그 나무는 즉시 대리인으로 컴파일 될 것입니다. State Machine과 Visitor 패턴에 대해 읽으면서 위와 같은 임의의 표현을 해석하는 가장 좋은 방법을 찾아보십시오.

PS 정규식 사용을 권장하지 않습니다.

+0

이것은 기본적으로 말하고있는 것입니다. 표현식 작성기가 실행되는 데는 약간의 시행 착오가있을 것입니다! = D – Tejs

+1

동적 쿼리 라이브러리가 올바르게 작동합니다. 나는 NHibernate DAL 클래스에 우리 Linq에 바로 연결했고 꽤 멋지게 연주했다. – mikeschuld