有没有办法使用System.Linq.Dynamic查询Type

时间:2014-01-13 12:58:27

标签: c# linq dynamic-linq

我的班级“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!

任何解决方案?

2 个答案:

答案 0 :(得分:1)

此功能(CastOfType)现在在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");