Queryable.Select使用带有多个参数的选择器表达式

时间:2014-12-12 13:24:53

标签: c# iqueryable func

我已经定义了一个如下所示的选择器表达式:

private Expression<Func<myTable, MyCustomModel>> selectorExpression = m => new MyCustomModel
{
    ID = m.id,
    Name = m.name,
    Score = 10
}

我这样使用它:

IQueryable<DebtorModel> query = (from myTable in context.myTables
                                    where myTable.id == 4
                                    select myTable).Select(selectorExpression);

我想要做的是将得分作为参数传递,所以我做了这样的事情:

private Expression<Func<myTable, int, MyCustomModel>> selectorExpressionV2 = (m, score) => new MyCustomModel
{
    ID = m.id,
    Name = m.name,
    Score = score
}                                   

我可以将selectorExpressionV2应用于上面的查询吗?我试过这个:

IQueryable<DebtorModel> query = (from myTable in context.myTables
                                    where myTable.id == 4
                                    select new {myTable, score = 10}).Select(selectorExpressionV2);

但它没有用。我得到一个错误,比如 方法的类型参数不能从用法尝试指定类型参数...

推断出来

我没有意识到我应该怎么写这个......或者如果可能的话:):

1 个答案:

答案 0 :(得分:1)

执行此操作时:

select new {myTable, score = 10}

您创建了一个匿名类型,因此,selectorExpression应为Expression<Func<MyAnnonymousType, MyCustomModel>>,但您不能这样做,因为它是一个匿名类型。

你应该创建一个新类来保存myClass和得分的值,就像Ben Robinson在他的评论中所说的那样,或者如果得分是整个linq语句中的常量,你可以这样做:

private Expression<Func<MyClass, MyCustomModel>> GetSelectorExpression(int score) {
    return m => new MyCustomModel
    {
        ID = m.id,
        Name = m.name,
        Score = score
    }
}

然后使用它时:

var selectorExpression = GetSelectorExpression(10);
IQueryable<DebtorModel> query = (from myTable in context.myTables
                                    where myTable.id == 4
                                    select new myTable).Select(selectorExpression);