System.Int32'类型的表达式不能用于'System.Object'方法'Boo

本文关键字:System Object 方法 Boo 用于 Int32 类型 表达式 不能 | 更新日期: 2023-09-27 18:02:46

我在使用网格视图列明智搜索工具时遇到了一个错误。这里有多个列,有varchar,int和nullable。我做一个辅助方法像FilterColumn,需要两个参数(ColumnName,SearchText)。现在我在使用int值进行过滤时遇到了一个问题。

方法如下:

public static class Helper
{
    public static IQueryable<T> FilterForColumn<T>(this IQueryable<T> queryable, string colName, string searchText)
    {
        if (colName != null && searchText != null)
        {
            var parameter = Expression.Parameter(typeof(T), "m");
            var propertyExpression = Expression.Property(parameter, colName);
            System.Linq.Expressions.ConstantExpression searchExpression = null;
            System.Reflection.MethodInfo containsMethod = null;
            // this must be of type Expression to accept different type of expressions
            // i.e. BinaryExpression, MethodCallExpression, ...
            System.Linq.Expressions.Expression body = null;
            Expression ex1 = null;
            Expression ex2 = null;
            Expression converted = null;
            switch (colName)
            {
                // section for int properties
                case "party_id":
                case "type_id":
                case "status_id":
                case "category_id":  //here problem occurs
                    Int32 _int = Convert.ToInt32(searchText);
                    searchExpression = Expression.Constant(_int);
                    containsMethod = typeof(Int32).GetMethod("Equals", new[] { typeof(Int32) });
                    body = Expression.Call(propertyExpression, containsMethod, searchExpression);
                    break;
                // section for int? properties
                case "country_id":
                case "state_id":
                    Int32? _int1 = Convert.ToInt32(searchText);
                    searchExpression = Expression.Constant(_int1);
                    converted = Expression.Convert(searchExpression, typeof(object));
                    containsMethod = typeof(Int32?).GetMethod("Equals", new[] { typeof(Int32?) });
                    body = Expression.Call(propertyExpression, containsMethod, converted);
                    break;
                // section for DateTime? properties
                case "PublishDate":
                case "Birth_date":
                case "Anniversary_date":
                case "Profile_Updated_datetime":
                case "CompletedOn":
                    DateTime currentDate = DateTime.ParseExact(searchText, "dd/MM/yyyy", null);
                    DateTime nextDate = currentDate.AddDays(1);
                    ex1 = Expression.GreaterThanOrEqual(propertyExpression, Expression.Constant(currentDate, typeof(DateTime?)));
                    ex2 = Expression.LessThan(propertyExpression, Expression.Constant(nextDate, typeof(DateTime?)));
                    body = Expression.AndAlso(ex1, ex2);
                    break;
                // section for DateTime properties
                case "Created_date":
                case "Register_Date":
                    DateTime currentDate1 = DateTime.ParseExact(searchText, "dd/MM/yyyy", null);
                    DateTime nextDate1 = currentDate1.AddDays(1);
                    ex1 = Expression.GreaterThanOrEqual(propertyExpression, Expression.Constant(currentDate1));
                    ex2 = Expression.LessThan(propertyExpression, Expression.Constant(nextDate1));
                    body = Expression.AndAlso(ex1, ex2);
                    break;
                default:
                    searchExpression = Expression.Constant(searchText);
                    containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
                    body = Expression.Call(propertyExpression, containsMethod, searchExpression);
                    break;
            }
            var predicate = Expression.Lambda<Func<T, bool>>(body, new[] { parameter });
            return queryable.Where(predicate);
        }
        else
        {
            return queryable;
        }
    }
}

和这里是我的搜索按钮代码我如何传递列值和搜索值FillGrid:

protected void btnsearch_Click(object sender, System.EventArgs e)
    {
        if (DDL_Column_List.SelectedItem.Value.Equals("19"))
        {
            RegularExpressionValidator5.Enabled = true;
        }
      if (Page.IsValid)
        {
            using (DataClassesDataContext db = new DataClassesDataContext())
            {
                System.Threading.Thread.Sleep(2000);
                if (DDL_Column_List.SelectedItem.Value != "-1" && txtsearch.Text.Trim() != "")
                {
                    switch (DDL_Column_List.SelectedItem.Text.ToString())
                    {
                        case "Name":
                            Session["ColumnName"] = "Name";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Type":
                            Session["ColumnName"] = "type_id";
                            Session["SearchText"] = db.PartyTypes.Where(t => t.typename.Contains(txtsearch.Text.Trim())).Select(t => t.Id).SingleOrDefault().ToString();
                            break;
                        case "Owner Name":
                            Session["ColumnName"] = "Ownername";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Owner Mobile":
                            Session["ColumnName"] = "Ownermob";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Contact Person Name":
                            Session["ColumnName"] = "ContactPerson";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Contact Person Mobile":
                            Session["ColumnName"] = "ContactPersonmob";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Phone":
                            Session["ColumnName"] = "Phone";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Mobile":
                            Session["ColumnName"] = "Mobile";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Room":
                            Session["ColumnName"] = "Room";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Building":
                            Session["ColumnName"] = "Build";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Road":
                            Session["ColumnName"] = "Road";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Area":
                            Session["ColumnName"] = "Area";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "City":
                            Session["ColumnName"] = "City";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Country":
                            Session["ColumnName"] = "country_id";
                            Session["SearchText"] = db.Countries.Where(c => c.Country_name.Equals(txtsearch.Text.Trim())).Select(c => c.Id).SingleOrDefault().ToString();
                            break;
                        case "State":
                            Session["ColumnName"] = "state_id";
                            Session["SearchText"] = db.States.Where(s => s.state_name.Equals(txtsearch.Text.Trim())).Select(s => s.Id).SingleOrDefault().ToString();
                            break;
                        case "Email":
                            Session["ColumnName"] = "Email";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Remark":
                            Session["ColumnName"] = "Remark";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Username":
                            Session["ColumnName"] = "Username";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                        case "Register Date":
                            Session["ColumnName"] = "Register_Date";
                            Session["SearchText"] = txtsearch.Text.Trim();
                            break;
                    }
                }
                else
                {
                    Session["SearchText"] = null;
                    Session["ColumnName"] = null;
                }
                this.FillGrid((String)Session["StartAlpha"] ?? null, (int)Session["GroupByENTYPE"] , (String)Session["ColumnName"] ?? null, (String)Session["SearchText"] ?? null);
                UpdatePanel10.Update();
                MPE.Show();
            }
        }
    }

在这里,当用户键入一些字符串值(如'Customer')时,在处理int值时遇到了一个问题。然后我必须找出哪个id属于这个文本,我把这个id传递给会话,然后我的助手方法过滤它。type_id case有问题。这里有一个错误抛出:

Server Error in '/CRM' Application.
Expression of type 'System.Int32' cannot be used for parameter of type 'System.Object' of method 'Boolean Equals(System.Object)'
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 
Exception Details: System.ArgumentException: Expression of type 'System.Int32' cannot be used for parameter of type 'System.Object' of method 'Boolean Equals(System.Object)'
Source Error: 

Line 42:                     converted = Expression.Convert(searchExpression, typeof(object));
Line 43:                     containsMethod = typeof(Int32).GetMethod("Equals", new[] { typeof(Int32) });
Line 44:                     body = Expression.Call(propertyExpression, containsMethod, searchExpression);
Line 45:                     break;
Line 46:                 case "country_id":
Source File: f:'CRM'App_Code'Helper.cs    Line: 44 
Stack Trace: 

[ArgumentException: Expression of type 'System.Int32' cannot be used for parameter of type 'System.Object' of method 'Boolean Equals(System.Object)']
   System.Linq.Expressions.Expression.ValidateOneArgument(MethodBase method, ExpressionType nodeKind, Expression arg, ParameterInfo pi) +4189655
   System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodBase method, ExpressionType nodeKind, ReadOnlyCollection`1& arguments) +132
   System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable`1 arguments) +71
   System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, Expression[] arguments) +29
   Helper.FilterForColumn(IQueryable`1 queryable, String colName, String searchText) in f:'CRM'App_Code'Helper.cs:44
   Staff_Raise_Ticket.FillGrid(String StartAlpha, Int32 GroupByENTYPE, String ColumnName, String SearchText) in f:'CRM'Staff'Raise_Ticket.aspx.cs:249
   Staff_Raise_Ticket.btnsearch_Click(Object sender, EventArgs e) in f:'CRM'Staff'Raise_Ticket.aspx.cs:1342
   System.Web.UI.WebControls.Button.OnClick(EventArgs e) +118
   System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) +112
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument) +10
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument) +13
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData) +36
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +5563
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.1

我不明白这里出了什么问题....

System.Int32'类型的表达式不能用于'System.Object'方法'Boo

错误中的代码与您的Helper方法的代码不匹配。错误报告如下:

    converted = Expression.Convert(searchExpression, typeof(object));
    containsMethod = typeof(Int32).GetMethod("Equals", new[] { typeof(Int32) });
    body = Expression.Call(propertyExpression, containsMethod, searchExpression);
    break;
case "country_id":

当我在你的代码中搜索case "country_id":时,我发现了这些行:

case "category_id":  //here problem occurs
    Int32 _int = Convert.ToInt32(searchText);
    searchExpression = Expression.Constant(_int);
    containsMethod = typeof(Int32).GetMethod("Equals", new[] { typeof(Int32) });
    body = Expression.Call(propertyExpression, containsMethod, searchExpression);
    break;
// section for int? properties
case "country_id":

错误

报告的第一行代码
converted = Expression.Convert(searchExpression, typeof(object));

没有出现在你发布的代码中,很可能是错误的来源:你试图调用一个方法,期望一个Int32参数与object参数,因为你正在转换searchExpression(可能已经有正确的类型,Int32)类型object。确保您正在查看的代码是正在执行的代码,并删除到object的转换。