Expression在Int32字段上使用StartWith创建谓词

时间:2013-03-19 12:00:09

标签: c# .net expression predicate

下面的表达式构建工作正常。如果subMember是字符串,则没问题。

想象一下,现在我收到一个名为subMember的{​​{1}},此CodeCode。在此, 我想制作一个Int32,但我无法解析,因为它是StartWith。我想,我必须这样做 转换为字符串。我该如何实现呢?

Ex:100,102,105,200,300,301,3011 ......

如果subMember =“10”,则结果为100,102,105

如果subMember =“30”,则结果为300,301,3011

如果subMember =“301”,则结果为301,3011

Int32

1 个答案:

答案 0 :(得分:1)

由于StartsWith只对字符串有意义,我要做的第一件事就是使用string value简化事情。现在,在foreach循环解析成员后,我们可以检查body的类型:

if(body.Type != typeof(string)) body = Expression.Call(body, "ToString", null);

然后应用StartsWith

body = Expression.Call(body, "StartsWith", null, Expression.Constant(value));

然后创建lambda:

return Expression.Lambda<Func<T, bool>>(body, p);

然而!如果这是针对LINQ-to-EF / LINQ-to-SQL,则它将依赖于支持语法的库,例如:

.Where(x => x.Foo.Bar.ToString().StartsWith("1"))

因为那是正在构建的。此外,我不希望这适用于任何数据库索引;在文本"1"开头的那些搜索整数不是一个明显的索引操作。最后:注意负数等; -1 "1"没有“开始”。