我的班级“A”有一个班级“B”的集合。 “D”是“B”的子类,属性为“DMatter”(不是继承自“B”)
我可以使用常规Linq选择具有某些内容的“D”的“A”:
var result =
Aset.Where(a => a.Bs.OfType<D>().Any(d => d.DMatter.Contains("ii"))); //works!
我可以像B一样动态地使用B的属性:
var result = Aset.Where("Bs.Any(BStuff.Contains(\"bb\"))");//works!
但我找不到这样的方法:
result = Aset.Where("Bs.OfType<D>().Any(DMatter.Contains(\"ii\"))");//Explodes!
任何解决方案?
答案 0 :(得分:1)
此功能(Cast
和OfType
)现在在System.Linq.Dynamic.Core中实现。
请参阅api文档:OfType
答案 1 :(得分: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");