2014-11-02 4 views
0

탐색 속성을 통해 관련 엔터티가있는 일종의 일반 쿼리 작성기를 만들려고합니다. 그래서 저는 다음과 같이 말하고 싶습니다 :관련된 엔터티에 대한 람다 식 트리

var results = from entityA in context.entityAs 
where entityA.NavigationPropertyB.PropertyZ = value1 
group entityA by entityA.NavigationPropertyC.PropertyY into g 
select new { propertyY = g.Key, value = g.OperatorD(x=>x.PropertyX)} 

여기서 엔티티 A, 관련 속성 및 연산자는 즉시 제공 될 수 있습니다. 나는 주어진 엔티티 타입에 대한 프로퍼티들의 컬렉션을 얻고 그것들을 사용하여 다이나믹 쿼리의 람다 표현 트리를 만들 것을 생각하고 있었다.

a) 작동합니까? 그것은 합리적인가?

b) 관련 엔터티에 대한 속성을 포함하여 쿼리하려는 모든 속성을 하나의 컬렉션으로 가져 오는 쉬운 방법이 있습니까?

c) 런타임시 전달되는 관련 엔터티를 포함하여 쿼리 트리가 어떻게 표시됩니까?

+0

필자는 Dynamic Linq로 시작하겠다. 장점은 is가 이미 구현되어 있다는 것입니다. 쿼리는 문자열로 전달되므로 동적 Where 절은'.Where ("NavigationProperty.PropertyZ = \"value1 \ "")'가됩니다. –

답변

0

음, 나는 비슷한 것을했습니다.

LINQ Expressions (System.Linq.Expressions 네임 스페이스)를 사용했으며 작은 파서도 만들었습니다.

나는 약간의 시간이 걸렸지 만, 나는 그것에 매우 만족하고있다. 그것은 전체 적용을위한 박동의 마음이다, 그렇다, 그것은 작동하고, 그것은 합리적인 것이다.

b) :
VS 편집기에서 코드로 작성할 수있는 것이 무엇이든 관계없이 LINQ 표현식을 사용하여 작성 (표현) 할 수 있습니다. Where() 또는 Count()와 같은 일부 메소드는 Join() 또는 GroupBy()와 같이 더 어려워 보이지만 하루가 끝나면 모두 완료 할 수 있습니다.

c) 쿼리를 정적으로 작성하든 런타임에 동적으로 작성하든 관계없이 표현식 트리는 동일하게 보이며 구체화 할 때만 평가됩니다. 그것은 시간이 (당신이 그것을 필요로 얼마나 따라 다름) 가치가 없을 수 있습니다

string query = "db.Documents.Count() != 0 ? db.Documents.Where(d => d.No == 176).Items.Select(a => a.Debit).Sum() : 0"; 
var result = ExprBuilder.DoExpression(new MyDbContext(), query); 

그래서 기본적으로, 그것은 매우 쉬운 일이 아닙니다, 그러나 그것은 할 수 있고 매우 편리 올 수 있습니다 :

다음은 예입니다.