c#Linq表达式生成器表达式。以错误的方式显示参数

c#Linq表达式生成器表达式。以错误的方式显示参数,c#,entity-framework,linq,linq-to-entities,C#,Entity Framework,Linq,Linq To Entities,我正在尝试使用表达式为高级搜索工具构建一些动态Linq 我这样调用我的定义表达式生成器: IQueryable<DocPod> retval = Enumerable.Empty<Doc>().AsQueryable(); retval = DefineSearchExpression(x => x.Id, searchCriteria.searchData

我正在尝试使用表达式为高级搜索工具构建一些动态Linq

我这样调用我的定义表达式生成器:

IQueryable<DocPod> retval = Enumerable.Empty<Doc>().AsQueryable();
retval = DefineSearchExpression(x => x.Id,                  
                                     searchCriteria.searchData.Comparison,
                                     searchCriteria.searchData.NumberFrom,                                            
                                     searchCriteria.searchData.NumberTo);
IQueryable retval=Enumerable.Empty().AsQueryable();
retval=DefineSearchExpression(x=>x.Id,
searchCriteria.searchData.Comparison,
searchCriteria.searchData.NumberFrom,
searchCriteria.searchData.NumberTo);
为了解释以上内容,我在一个页面上有多个属性,每个属性都有一个下拉列表,提供各种搜索类型,因此在上面的例子中,我有一个名为Id的int,然后是一个比较,可以是equals、notequals、than等。。。然后,根据选择的比较,NumberFrom是主要的搜索参数,应该始终填充,但是在进行两次比较的情况下,NumberTo参数也会填充

函数DefineSearchExpression如下所示:

    private IQueryable<Docs> DefineSearchExpression(Expression<Func<Docs, object>> searchColumnName, int compare, object minValue, object maxValue)
    {
        IQueryable<Docs> retval = Entities.Docs.AsQueryable();

        // We must have a minValue to process
        if (minValue == null)
        {
            return retval;
        }

        // LINQ Expression that represents the column passed in searchColumn
        var columnExpression = GetMemberExpression(searchColumnName);

        // LINQ Expression to represent the parameter of the lambda you pass in
        ParameterExpression parameterExpression = (ParameterExpression)columnExpression.Expression;
        // Expressions to represent min and max values
        Expression minValueExpression = null;
        Expression maxValueExpression = null;
        Expression minComparisonExpression = null;
        Expression maxComparisonExpression = null;

         // Represents the completed filter
        Expression<Func<Docs, bool>> filterLambdaExpression = null; 
        // setup vars
        if (minValue.IsNumeric())
        {
            var intfromValue = int.Parse(minValue.ToString());
            minValueExpression = Expression.Constant(intfromValue);
            if (maxValue != null)
            {
                var inttoValue = int.Parse(maxValue.ToString());
                maxValueExpression = Expression.Constant(inttoValue);
            }
        }
        else if (minValue.IsDate())
        {
            var dtfromValue = DateTime.Parse(minValue.ToString());
            minValueExpression = Expression.Constant(dtfromValue);
            if (maxValue != null)
            {

                var dttoValue = DateTime.Parse(maxValue.ToString());
                maxValueExpression = Expression.Constant(dttoValue);
            }
        }

        // Expression represented by selection in dropdown List
        switch (compare)
        {
            //
            // THIS IS WHERE THE FIRST ISSUES IS LOCATED
            //
            //
            case 0: // This should be equivalent to: field = value
                minComparisonExpression = Expression.Equal(minValueExpression, columnExpression);
                filterLambdaExpression = Expression.Lambda<Func<Docs, bool>>(minComparisonExpression, parameterExpression);
                break;
        }

        retval = retval.AsQueryable().Where(filterLambdaExpression);
        return retval.AsQueryable();
    }
private IQueryable definesearch表达式(表达式searchColumnName、int compare、object minValue、object maxValue)
{
IQueryable retval=Entities.Docs.AsQueryable();
//我们必须有一个最小值来处理
if(minValue==null)
{
返回返回;
}
//表示在searchColumn中传递的列的LINQ表达式
var columnExpression=GetMemberExpression(searchColumnName);
//LINQ表达式,表示传入的lambda的参数
ParameterExpression ParameterExpression=(ParameterExpression)columnExpression.Expression;
//表示最小值和最大值的表达式
表达式minValueExpression=null;
表达式maxValueExpression=null;
表达式minComparisonExpression=null;
表达式maxComparisonExpression=null;
//表示已完成的筛选器
表达式filterLambdaExpression=null;
//设置变量
if(minValue.IsNumeric())
{
var intfromValue=int.Parse(minValue.ToString());
minValueExpression=表达式常数(intfromValue);
if(maxValue!=null)
{
var inttoValue=int.Parse(maxValue.ToString());
maxValueExpression=表达式常数(inttoValue);
}
}
else if(minValue.IsDate())
{
var dtfromValue=DateTime.Parse(minValue.ToString());
minValueExpression=表达式常数(dtfromValue);
if(maxValue!=null)
{
var dttoValue=DateTime.Parse(maxValue.ToString());
maxValueExpression=表达式常数(dttoValue);
}
}
//下拉列表中由所选内容表示的表达式
开关(比较)
{
//
//这是第一批问题所在的地方
//
//
案例0://这应等同于:field=value
minComparisonExpression=Expression.Equal(minValueExpression,columnExpression);
filterLambdaExpression=Expression.Lambda(minComparisonExpression,parameterExpression);
打破
}
retval=retval.AsQueryable().Where(filterLambdaExpression);
返回retval.AsQueryable();
}
正如您所看到的,我试图在搜索时考虑数字、日期时间和最后的字符串数据

当执行上述代码时,当开关案例0中的代码提供以下异常时

minComparisonExpression的调试值为1977836648==$x.Id

我曾试图交换这些价值观,但收效甚微,如果有人知道如何解决这个问题,我将非常感激

第二,当DefineSearchExpression返回时,新表达式丢失,这很可能是我,但我就是看不到它

哎呀。感谢您发现错误,但这并没有帮助,因为有问题的代码在Switch Case 0语句中,日期代码目前根本没有运行


代码更新

您使用的日期中有输入错误,您使用的是
minComparisonExpression
而不是
minValueExpression
,您的意思是什么?
Expression.Equal的第一个参数是
left
,第二个参数是
right
。所以你真的需要交换参数。我这样做了,以minComparisonExpression=Expression.Equal(minValueExpression,columnExpression)开始;实际读取minComparisonExpression=Expression.Equal(columnExpression,minValueExpression);解析后,
intfromValue
的值是多少?