从Func返回Func

时间:2011-11-24 20:17:25

标签: c# linq

我正在尝试使用LinqKit动态生成linqtosql查询。我想在将表达式发送到LinqKit之前检查我想要为预测添加的字段。所以我想出了一些像

这样的想法
 Expression<Func<TResult, bool>> GetPrediction<TKey>
                            (Expression<Func<TResult, TKey>> selector, TResult input,  object value)
 {
    if(typeof(TKey) == typeof(string))
    {
         return selector.Invoke(input) == value; //Not working, how to covert here?
    }
    Throw new Exception("Type not supported");
 }

我被困在第5行,在那里我应该生成一个表达式<Func<TResult, bool>>并返回。我知道这是可能的,但是很难获得“点击”

2 个答案:

答案 0 :(得分:3)

我想你想要这样的东西:

public static Expression<Func<TResult, bool>> GetPredicate<TKey>
    (Expression<Func<TResult, TKey>> selector, TResult input, object value)
{
    // Note: Move "early out" here so that bulk of method is less deeply nested.
    // Really? Why make this generic in TKey then?
    if (typeof(TKey) != typeof(string))
    {
        throw new Exception("Type not supported");
    }

    var parameter = Expression.Parameter("input");
    var invocation = Expression.Invoke(selector, input);
    var constant = Expression.Constant(value);
    var equality = Expression.Equal(invocation, constant);
    return Expression.Lambda<Func<TResult, bool>>(equality, parameter);
}

我不太确定会使用什么样的平等,请注意 - 它完全有可能使用引用平等操作,而我怀疑你想要 value 平等。您必须尝试查看,因为字符串实习而在测试中要小心。

答案 1 :(得分:0)

return p => (selector.Compile().Invoke(input) as string) == value