2014-01-13 2 views
1

클래스 "B"의 컬렉션이있는 클래스 "A"가 있습니다. "D"는 속성 "DMatter"("B"에서 상속받지 않음)를 가진 "B"의 서브 클래스입니다.System.Linq.Dynamic을 사용하여 Type에서 쿼리하는 방법이 있습니까?

정규 Linq로 다음과 같은 특정 내용으로 "D"가있는 "A"

var result = 
    Aset.Where(a => a.Bs.OfType<D>().Any(d => d.DMatter.Contains("ii"))); //works! 
내가 너무 좋아하는 B의 특성에 동적으로 할 수

:

var result = Aset.Where("Bs.Any(BStuff.Contains(\"bb\"))");//works! 

그러나 나는 이런 식으로 뭔가 할 수있는 방법 찾을 수 없습니다 :

result = Aset.Where("Bs.OfType<D>().Any(DMatter.Contains(\"ii\"))");//Explodes! 

모든 솔루션?

+0

것을 명확히 "폭발한다!" : – wudzik

+0

@wudzik : 예외가 있습니다 : ParseException >> "List'1 '형식의'OfType '속성이 없습니다. System.Linq.Dynamic.ExpressionParser.ParseMemberAccess (Type 유형, 식 인스턴스)에서 에 존재합니다. –

+1

'System.Linq.Dynamic.ExpressionParser'의 코드에서 불행히도'OfType' 파싱이 구현되지 않은 것으로 보입니다. [이 기사 참조] (http://social.msdn.microsoft.com/Forums/en-US/fbfa7e59-e97f-4d34-9810-5dbf6b8f444c/dynamic-linq-expression-for-oftype-and-sum?forum= linqtosql)에 관해서. –

답변

0

System.Linq.Dynamic.ExpressionParser 코드를 살펴보면 안타깝게도 OfType 구문 분석이 구현되지 않은 것으로 보입니다. 문제 해결 방법은 IQueryable 확장 방법으로 제공되며 이에 대해서는 this article을 참조하십시오. System.Linq.Dynamic.ExpressionParser 소스에 깊이 빠져들지 않고 얻을 수있는 것 중 가장 많은 것 같습니다.

public static class MyQueryExtensions 
{ 
    public static IQueryable OfType(this IQueryable source, string typeStr) 
    { 
     if (source == null) 
     { 
      throw new ArgumentNullException("source"); 
     } 
     if (typeStr == null) 
     { 
      throw new ArgumentNullException("typeStr"); 
     } 

     Type type = Assembly.GetExecutingAssembly().GetType(typeStr); 
     MethodInfo methodOfType = typeof(Queryable).GetMethods().First(m => m.Name == "OfType" && m.IsGenericMethod); 

     return source.Provider.CreateQuery(Expression.Call(null, methodOfType.MakeGenericMethod(new Type[] { type }), new Expression[] { source.Expression })); 
    } 
} 

다음을 수행 할 수 있습니다

var result = someList.OfType("SomeNamespace.SomeClass"); 
관련 문제