我有“ A”类,其中有“ B”类的集合。“ D”是具有属性“ DMatter”的“ B”的子类(不是从“ 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
源代码就能获得的最大收益。
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");
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句