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())