下面的代码有效,但我想介绍ToUpper()
var predicate =
Expression.Lambda<Func<T, bool>>(
Expression.Call(
Expression.PropertyOrField(parameter, "FirstName"),
"Contains", null,
Expression.Constant("myvalue".ToUpper())), parameter
);
结果是:
{Param_0 => Param_0.FirstName.Contains("MYVALUE")}
但我喜欢这个:
{Param_0 => Param_0.FirstName.ToUpper().Contains("MYVALUE")}
我该如何改变?
答案 0 :(得分:5)
Contains
调用FirstName
属性的结果。您需要先在属性上调用ToUpper
,例如
var firstName = Expression.PropertyOrField(parameter, "FirstName");
var firstNameUpper = Expression.Call(firstName, "ToUpper", null);
var target = Expression.Constant("myvalue".ToUpper());
var contains = Expression.Call(firstNameToUpper, "Contains", null, target);
var lambda = Expression.Lambda<Func<T, bool>>(contains, parameter);
请注意,这不是“文化安全的” - 使用不区分大小写的比较会更安全。 This question显示了使用IndexOf
的方法,但LINQ提供程序可能不支持(我不知道您之后使用此表达式树做了什么)。
答案 1 :(得分:5)
只需添加Expression.Call
:
var predicate =
Expression.Lambda<Func<T, bool>>(
Expression.Call(
Expression.Call( // <=== this one is new
Expression.PropertyOrField(parameter, "FirstName"),
"ToUpper", null),
"Contains", null,
Expression.Constant("myvalue".ToUpper())), parameter
);
然后将其报告为:
Param_0 => Param_0.FirstName.ToUpper().Contains("MYVALUE")