2014-01-13 74 views
1

我有「A」級,其具有「B」類的集合類型的查詢。 「D」是屬性爲「DMatter」(不是從「B」繼承)的屬性「B」的子類有沒有一種方法來使用System.Linq.Dynamic

我可以選擇具有「D」特定內容的「A」,像這樣的常規Linq:

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 >>沒有屬性或字段'OfType'存在於類型'List'1' at System.Linq.Dynamic.ExpressionParser.ParseMemberAccess(Type type,Expression instance) –

+1

翻閱'System.Linq.Dynamic.ExpressionParser'的代碼,不幸的是,沒有實現'OfType'解析。請參閱[本文](http://social.msdn.microsoft.com/Forums/en-US/fbfa7e59-e97f-4d34-9810-5dbf6b8f444c/dynamic-linq-expression-for-of-type-and-sum?forum= linqtosql)關於它。 –

回答

0

通過System.Linq.Dynamic.ExpressionParser的代碼來看,似乎沒有OfType解析不幸實現。請參閱this article,其中解決方法提供爲IQueryable擴展方法。看起來這是你不需要深入探索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"); 
相關問題