C# 使用带值类型和字符串的表达式树创建动态Linq查询?

C# 使用带值类型和字符串的表达式树创建动态Linq查询?,c#,linq,linq-to-entities,predicatebuilder,C#,Linq,Linq To Entities,Predicatebuilder,我正在尝试创建一个动态搜索表达式树,它接受一个表列列表和一个搜索词数组,并返回一个表达式。下面的代码适用于非值类型,但我不知道如何使其适用于ValueType属性。i、 e.字符串有效,但数字无效 public static Expression<Func<T, bool>> CreateDynamicSearch<T>(List<string> searchableColumns, string[] searchTerms) {

我正在尝试创建一个动态搜索表达式树,它接受一个表列列表和一个搜索词数组,并返回一个表达式。下面的代码适用于非值类型,但我不知道如何使其适用于ValueType属性。i、 e.字符串有效,但数字无效

    public static Expression<Func<T, bool>> CreateDynamicSearch<T>(List<string> searchableColumns, string[] searchTerms)
    {
        var predicate = PredicateBuilder.New<T>(true);
        try {
            foreach (var term in searchTerms) {
                var colPredicate = PredicateBuilder.New<T>(true);
                foreach (var columnName in searchableColumns) {
                    var columnFilter = PredicateBuilder.New<T>(false);
                    var param = Expression.Parameter(typeof(T), "a");
                    MemberExpression prop = Expression.Property(param, columnName);
                    var propInfo = (PropertyInfo)prop.Member;
                    MethodCallExpression call;
                    if (propInfo.PropertyType.IsValueType) {
                        if (int.TryParse(term, out int num)) {
                            call = Expression.Call(prop, "Equals", new Type[0],Expression.Constant(num)); 
                            columnFilter = columnFilter.And(Expression.Lambda<Func<T, bool>>(call, param));
                            colPredicate = colPredicate.Or(columnFilter);
                        }
                    }
                    else {
                        call = Expression.Call(prop, "Contains", new Type[0], Expression.Constant(term));
                        columnFilter = columnFilter.And(Expression.Lambda<Func<T, bool>>(call, param));
                        colPredicate = colPredicate.Or(columnFilter);
                    }
                }
                //AND the term predicate with the previous predicate
                predicate = predicate.And(colPredicate);
            }
        }
        catch (Exception ex) {
            throw;
        }
        return predicate;
    }
公共静态表达式CreateDynamicSearch(列出可搜索的列,字符串[]searchTerms)
{
var predicate=PredicateBuilder.New(true);
试一试{
foreach(搜索术语中的var术语){
var colPredicate=PredicateBuilder.New(true);
foreach(searchableColumns中的变量columnName){
var columnFilter=PredicateBuilder.New(false);
var param=表达式参数(类型(T),“a”);
MemberExpression prop=Expression.Property(参数、列名);
var propInfo=(PropertyInfo)prop.Member;
MethodCallExpression调用;
if(propInfo.PropertyType.IsValueType){
if(int.TryParse(term,out int num)){
call=Expression.call(prop,“Equals”,新类型[0],Expression.Constant(num));
columnFilter=columnFilter.And(Expression.Lambda(call,param));
colPredicate=colPredicate.Or(columnFilter);
}
}
否则{
call=Expression.call(prop,“Contains”,新类型[0],Expression.Constant(term));
columnFilter=columnFilter.And(Expression.Lambda(call,param));
colPredicate=colPredicate.Or(columnFilter);
}
}
//以及带有前一个谓词的术语谓词
谓词=谓词。And(colPredicate);
}
}
捕获(例外情况除外){
投掷;
}
返回谓词;
}
我只是在钻研表达式树,所以任何建议都将不胜感激

使用此代码,我当前得到了一个值类型,当我得到该值类型时出错。错误是

类型“System”上没有方法“Equals”。可为null的“1[System.Int32]”与提供的参数兼容


使用LINQPad并分析lambda,编译器似乎将
Int32
常量转换为
Object
,并调用
Object Equals(Object)
版本:

Expression.Call(prop, "Equals", new Type[0], Expression.Convert(Expression.Constant(num), typeof(Object))); 

当你试图处理一个Int时会发生什么?我得到了上面添加的错误消息。好吧,这似乎与DB字段是一个可为null的Int(不是我的调用)有关。如果DB是真整数,那么Equals就可以正常工作。您是否尝试过我的建议更改
Convert
?Convert在这种情况下不起作用,因为num变量类型是可为null的整数。