使用字符串.在表达式中比较(a, b)
本文关键字:比较 字符串 表达式 | 更新日期: 2023-09-27 18:33:51
从昨天开始,我一直在自学表达式树,但在比较两个字符串值时遇到了问题。 我做了这个失败并出现错误的测试用例:
No method 'Compare' on type 'System.String' is compatible with the supplied arguments.
运行时在left = Expression.Call(
上失败
Type type = typeof(string);
Expression left, right;
left = Expression.Constant("1", type);
right = Expression.Constant("2", type);
// fails at run-time on the next statement
left = Expression.Call(
typeof(string),
"Compare",
new Type[] { type, type },
new Expression[] { left, right });
right = Expression.Constant(0, typeof(int));
我将在Expression.Equal, LessThan, LessThanOrEqual, GreaterThan or GreaterThanOrEqual
中使用生成的左和右。 这就是比较方法的原因。
我确定它很简单,我已经将我的代码归结为这个简单的测试用例。 有人看到我哪里出错了吗?
这是
Expression.Call
代码中的问题:
new Type[] { type, type },
这是试图调用string.Compare<string, string>
- 它们是通用参数,而不是正常参数的类型。鉴于它是一种非通用方法,只需在此处使用 null。
简短但完整的程序:
using System;
using System.Linq.Expressions;
class Test
{
static void Main()
{
var left = Expression.Constant("1", typeof(string));
var right = Expression.Constant("2", typeof(string));
var compare = Expression.Call(typeof(string),
"Compare",
null,
new[] { left, right });
var compiled = Expression.Lambda<Func<int>>(compare).Compile();
Console.WriteLine(compiled());
}
}
我试图做类似于lambda where子句(LINQ到SQL)的事情,并且由于各种搜索使我进入此页面,因此我将在这里分享这样的解决方案,以防它帮助其他登陆这里的人。
当您使用比较的泛型表达式简化正在执行的操作时,这是最简单的。
public static Expression CompareLessThanOrEqualTo(Expression e1, Expression e2)
{
var compare = Expression.Call(typeof(string),
"Compare",
null,
new[] { e1, e2 });
return Expression.LessThanOrEqual(compare, Expression.Constant(0));
}
然后你可以像使用任何其他表达式一样使用这个表达式
public static Expression<Func<TypeOfParent, bool>> PropertyLessThanOrEqualString<TypeOfParent, String>(PropertyInfo property, String value)
{
var parent = Expression.Parameter(typeof(TypeOfParent));
var expressionBody = CompareLessThanOrEqualTo(Expression.Property(parent, property), Expression.Constant(value));
return Expression.Lambda<Func<TypeOfParent, bool>>(expressionBody, parent);
}
女巫可以使用例如
public static IQueryable<T> ApplyFilters<T>(this IQueryable<T> query, List<GridFilters> gridFilters)
{
// foreach filter
// Get property (propertyInfo)
// Get Value(s)
// Apply Filter
query = query.Where(PropertyLessThanOrEqualString<T, string>(propertyInfo, value1));
// ...
return query;
}
如果您有需要应用的用户选择的筛选器列表,则可以在其中选择值和运算符,这将非常有用。 (开头为、包含、范围之间)