我正在尝试使用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>>
并返回。我知道这是可能的,但是很难获得“点击”
答案 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