クラス「B」のコレクションを持つクラス「A」があります。 「D」は「B」のサブクラスであり、プロパティは「DMatter」です(「B」から継承されません)。
通常の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!
解決策はありますか?
System.Linq.Dynamic.ExpressionParser
のコードを見ると、残念ながらOfType
解析が実装されていないようです。 これについては、 IQueryable
拡張メソッドとして回避策が提供されているこの記事を参照してください。 System.Linq.Dynamic.ExpressionParser
ソースを深く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");
この機能( Cast
およびOfType
)はSystem.Linq.Dynamic.Coreに実装されています 。
APIドキュメントを参照してください: OfType