Ich habe Klasse "A", die eine Sammlung der Klasse "B" hat. "D" ist eine Unterklasse von "B" mit der Eigenschaft "DMatter" (nicht von "B" geerbt)
Ich kann "A" mit einem "D" mit bestimmten Inhalten wie diesem mit regulärem Linq auswählen:
var result =
Aset.Where(a => a.Bs.OfType<D>().Any(d => d.DMatter.Contains("ii"))); //works!
Ich kann dynamisch auf B Eigenschaften wie folgt:
var result = Aset.Where("Bs.Any(BStuff.Contains(\"bb\"))");//works!
Aber ich kann keinen Weg zu so etwas finden:
result = Aset.Where("Bs.OfType<D>().Any(DMatter.Contains(\"ii\"))");//Explodes!
Irgendwelche Lösungen?
Wenn Sie den Code von System.Linq.Dynamic.ExpressionParser
, scheint es, dass leider keine OfType
Analyse implementiert ist. IQueryable
Sie diesen Artikel darüber, in dem die IQueryable
als IQueryable
Erweiterungsmethoden bereitgestellt wird. Es scheint, dass es das Beste ist, was Sie erreichen können, ohne tief in die System.Linq.Dynamic.ExpressionParser
Quelle 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 }));
}
}
und dann können Sie:
var result = someList.OfType("SomeNamespace.SomeClass");
Diese Funktionalität ( Cast
und OfType
) ist jetzt in System.Linq.Dynamic.Core implementiert.
Siehe die API-Dokumentation: OfType