1

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

想象一下,现在我收到一个subMember命名Code,这Code是一个Int32。在这方面,我想制作一个StartWith,但我无法解析,因为它是一个Int32. 我想,我必须转换为字符串。我该如何实施?

例如:100、102、105、200、300、301、3011 ...

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

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

如果 subMember = "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);
}
4

1 回答 1

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".

于 2013-03-19T12:23:58.973 回答