C# 表达式使用Int32字段上的StartWith创建谓词

C# 表达式使用Int32字段上的StartWith创建谓词,c#,.net,expression,predicate,C#,.net,Expression,Predicate,下面的表达式生成器工作正常。如果子成员是字符串,则没有问题 想象一下,现在我收到一个名为code的子成员,这个code是一个Int32。对此,, 我想创建一个StartWith,但我无法解析,因为它是Int32。我想,我必须这么做 转换为字符串。我如何实现这一点 例:1001021052003003013011 如果subMember=“10”,则结果为100102105 如果subMember=“30”,则结果为3003013011 如果subMember=“301”,则结果为3013011

下面的表达式生成器工作正常。如果
子成员是字符串,则没有问题

想象一下,现在我收到一个名为
code
子成员,这个
code
是一个
Int32
。对此,, 我想创建一个
StartWith
,但我无法解析,因为它是
Int32
。我想,我必须这么做 转换为字符串。我如何实现这一点

例:1001021052003003013011

如果subMember=“10”,则结果为100102105

如果subMember=“30”,则结果为3003013011

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

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);
}
私有静态表达式BuildPredicate(字符串成员、对象值)
{
var p=表达式参数(typeof(T));
表达体=p;
foreach(member.Split('.')中的var子成员)
{
body=Expression.PropertyOrField(body,subMember);
}
返回表达式.Lambda(
表达式.Equal(体,表达式.Constant(value,body.Type)),p);
}

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

if(body.Type != typeof(string)) body = Expression.Call(body, "ToString", null);
然后用
应用
启动:

body = Expression.Call(body, "StartsWith", null, Expression.Constant(value));
然后创建lambda:

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

因为这就是正在建造的。而且,我不希望它能很好地与任何数据库索引一起工作;搜索以
“1”
文本开头的整数并不是一个明显的索引操作。最后:注意负数等
-1
不是以
“1”

开始的,因为
开始的时候只有字符串才有意义,所以我要做的第一件事就是通过使用
字符串值来简化事情。现在,在
foreach
循环解析成员后,我们可以检查
body
的类型:

if(body.Type != typeof(string)) body = Expression.Call(body, "ToString", null);
然后用
应用
启动:

body = Expression.Call(body, "StartsWith", null, Expression.Constant(value));
然后创建lambda:

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

因为这就是正在建造的。而且,我不希望它能很好地与任何数据库索引一起工作;搜索以
“1”
文本开头的整数并不是一个明显的索引操作。最后:注意负数等<代码>-1
不以
“1”开头

我同意代码字段类型。。。但有时我无法决定。关于您的解决方案,主体看起来正常,但在“StartWith”行上有一个异常:System.InvalidOperationException:No方法“StartsWith”on type“System.String”@Kris-I,此时值是多少?一根绳子?整数?或(请记住:我在第一段中说过,我使用了
value
作为
string
)值是10,我在string中添加了一个值,看起来还可以。让我试试more@Kris-在这种情况下,您可能只需要使用
Expression.Constant(value.ToString())
我同意代码字段类型。。。但有时我无法决定。关于您的解决方案,主体看起来正常,但在“StartWith”行上有一个异常:System.InvalidOperationException:No方法“StartsWith”on type“System.String”@Kris-I,此时值是多少?一根绳子?整数?或(请记住:我在第一段中说过,我使用了
value
作为
string
)值是10,我在string中添加了一个值,看起来还可以。让我试试more@Kris-在这种情况下,您可能只需要使用
Expression.Constant(value.ToString())