如何为 Like 创建 System.Linq.Expressions.Expression?
我创建了一个可过滤的 BindingList 来自此来源。 它工作得很好:
list.Filter("Customer == 'Name'");
做了它应该做的事。 其内部工作原理类似于解析器,它将表达式 ==
或 !=
转换为 System.Linq.Expressions.Expression
。 在这种情况下,==
变为System.Linq.Expressions.Expression.Equal
。
不幸的是 System.Linq.Expressions.Expression 不包含 like 运算符,我不知道如何解决这个问题。
初始代码如下所示:
private static Dictionary<String, Func<Expression, Expression, Expression>>
binaryOpFactory = new Dictionary<String, Func<Expression, Expression, Expression>>();
static Init() {
binaryOpFactory.Add("==", Expression.Equal);
binaryOpFactory.Add(">", Expression.GreaterThan);
binaryOpFactory.Add("<", Expression.LessThan);
binaryOpFactory.Add(">=", Expression.GreaterThanOrEqual);
binaryOpFactory.Add("<=", Expression.LessThanOrEqual);
binaryOpFactory.Add("!=", Expression.NotEqual);
binaryOpFactory.Add("&&", Expression.And);
binaryOpFactory.Add("||", Expression.Or);
}
然后我创建了一个可以执行我想要的操作的表达式:
private static System.Linq.Expressions.Expression<Func<String, String, bool>>
Like_Lambda = (item, search) => item.ToLower().Contains(search.ToLower());
private static Func<String, String, bool> Like = Like_Lambda.Compile();
例如
Console.WriteLine(like("McDonalds", "donAld")); // true
Console.WriteLine(like("McDonalds", "King")); // false
但是 binaryOpFactory
需要这样:
Func<Expression, Expression, Expression>
预定义的表达式似乎正是这样:
System.Linq.Expressions.Expression.Or;
谁能告诉我如何转换我的表达式?
I created a filterable BindingList from this source. It works great:
list.Filter("Customer == 'Name'");
does what it should. The internals work like a parser, that converts the expression ==
or !=
into System.Linq.Expressions.Expression
. In this case, ==
becomes System.Linq.Expressions.Expression.Equal
.
Unfortunately System.Linq.Expressions.Expression
does not contain a like operator and I don't know how to solve this.
The initial code looks like this:
private static Dictionary<String, Func<Expression, Expression, Expression>>
binaryOpFactory = new Dictionary<String, Func<Expression, Expression, Expression>>();
static Init() {
binaryOpFactory.Add("==", Expression.Equal);
binaryOpFactory.Add(">", Expression.GreaterThan);
binaryOpFactory.Add("<", Expression.LessThan);
binaryOpFactory.Add(">=", Expression.GreaterThanOrEqual);
binaryOpFactory.Add("<=", Expression.LessThanOrEqual);
binaryOpFactory.Add("!=", Expression.NotEqual);
binaryOpFactory.Add("&&", Expression.And);
binaryOpFactory.Add("||", Expression.Or);
}
Then I created an expression that will do what I want:
private static System.Linq.Expressions.Expression<Func<String, String, bool>>
Like_Lambda = (item, search) => item.ToLower().Contains(search.ToLower());
private static Func<String, String, bool> Like = Like_Lambda.Compile();
e.g.
Console.WriteLine(like("McDonalds", "donAld")); // true
Console.WriteLine(like("McDonalds", "King")); // false
But binaryOpFactory
requires this:
Func<Expression, Expression, Expression>
The predefined expressions seem to be exactly that:
System.Linq.Expressions.Expression.Or;
Can anyone tell me how to convert my expression?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
类似于:
就
Func
而言:Something like:
In terms of a
Func<Expression,Expression,Expression>
:我为
IEnumerable
和IQueryable
创建了 2 个扩展方法WhereFilter()
。通过这种方式,您还可以将此过滤器与实体框架一起使用,并且是在服务器上执行的过滤。
我使用了基于 * (不是?)的过滤器,因此我可以使用底层 Linq 方法
StartsWith()
、EndsWith()
和包含()
。 支持的格式:A*、*A、*A*、A*B用法:
这里是该类的基础知识:
I created 2 extension methods
WhereFilter()
forIEnumerable
andIQueryable
.At this way you can use this filter also with e.g. Entity Framework and is the filtering performed on the server.
I used a filter based on * (not ?) so i could use the underlaying Linq methods
StartsWith()
,EndsWith()
andContains()
. Supported formats: A*, *A, *A*, A*BUsage:
Here the basics of the class: