2013-03-19 34 views
1

下面的表达式生成器正常工作。如果subMember是一个字符串,则没有问题。表达式在Int32字段中创建一个带有StartWith的谓词

现在想象一下,我收到一个名为subMemberCode,这CodeInt32。在此, 我想作一个StartWith,但我无法解析,因为它是Int32。我想,我必须 转换为一个字符串。我怎样才能实现呢?

实施例:100,102,105,200,300,301,3011 ...

如果亚段= “10”,其结果是100102105

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

如果亚段=“301”,结果是301,3011

private static Expression<Func<T, bool>> BuildPredicate<T>(string member, object value) 
{ 
    var p = Expression.Parameter(typeof(T)); 
    Expression body = p; 
    foreach (var subMember in member.Split('.')) 
    { 
     body = Expression.PropertyOrField(body, subMember); 
    } 
    return Expression.Lambda<Func<T, bool>>(
     Expression.Equal(body, Expression.Constant(value, body.Type)), p); 
} 

回答

1

由于StartsWith才真正有意义的字符串,我会做的第一件事将是通过使用string value来简化事物。现在,经过了foreach循环,以解决成员,我们可以检查body类型:

​​

,然后应用StartsWith

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

然后创建拉姆达:

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

不过!如果这是LINQ到EF/LINQ到SQL,这将是依赖于库支持语法如:

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

,因为这是正在建设中的内容。另外,我不希望这可以适用于任何数据库索引;搜索整数文本"1"开头的整数不是一个明显的索引操作。最后:注意负数等; -1不与"1"“开始”。

+0

我同意代码字段类型...但有时我不能决定。关于您的解决方案身体看起来不错,但“StartWith”行有一个例外:System.InvalidOperationException:没有方法'StartsWith'类型'System.String' – 2013-03-19 12:35:45

+0

@ Kris-I和什么是'价值'在这个时候?一个字符串?一个int?要么...? (请记住:我在第一段中说过我使用'value'作为'string') – 2013-03-19 12:38:36

+0

值为10,我添加一个字符串并且看起来不错。让我试试更多 – 2013-03-19 12:43:09

相关问题