使用Select方法进行动态查询和表达式树

Mar*_*low 5 c# linq exception-handling expression-trees

我试图使用表达式树创建一个动态查询来匹配以下语句:

var items = data.Where(i => i.CoverageType == 2).Select(i => i.LimitSelected);
Run Code Online (Sandbox Code Playgroud)

我可以创建where方法并从中获取结果; 但是,我无法创建select方法.

这是我的where方法:

var parm = Expression.Parameter(typeof(BaseClassData), "baseCoverage");

var queryData = data.AsQueryable();

var left = Expression.Property(parm, "CoverageType");
var right = Expression.Constant(2m);
var e1 = Expression.Equal(left, right);

var whereMethod = Expression.Call(
    typeof(Queryable), 
    "Where", 
    new Type[] { queryData.ElementType }, 
    queryData.Expression, 
    Expression.Lambda<Func<BaseClassData, bool>>(e1, new ParameterExpression[] { parm }));
Run Code Online (Sandbox Code Playgroud)

这是我用于select方法的内容:

var selectParm = Expression.Property(parm, "LimitSelected");
     var selectMethod = Expression.Call(
        typeof(Enumerable),
        "Select",
        new Type[]{typeof(BaseClassData), typeof(decimal)},
        whereMethod,
        Expression.Lambda<Func<BaseClassData, decimal>>(selectParm, new ParameterExpression[]{ parm})

        );
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,我收到此错误:

类型'System.Linq.Enumerable'上没有泛型方法'Select'与提供的类型参数和参数兼容.如果方法是非泛型的,则不应提供类型参数.

我也尝试将Enumerable更改为Queryable,我得到了同样的错误.

uNo*_*ple -1

这可能有助于解决您上面描述的错误。

您不需要创建自己的 where/select,但是,c#/linq 中内置的那些可以与您自己的类一起正常工作:

void Main()
{
    List<testdata> data = new List<testdata>();
    Directory.GetFiles(@"C:\").ToList().ForEach(x=>data.Add(new testdata(){file=x,returnable=1}));
    data.Where(x=>x.file.Contains("g")).Select(x=>x.file).Dump();
}

class testdata
{
    public string file {get; set;}
    public string returnable {get; set;}
}
Run Code Online (Sandbox Code Playgroud)