2014-05-12 28 views
0

我在面對grid view列明智搜索工具時遇到了一個錯誤。這裏我有varchar,int和nullable等多列。我做了一個像FilterColumn這樣的幫助方法,它接受兩個參數(ColumnName,SearchText)。現在我用int值過濾時遇到了一個問題。類型'System.Int32'的表達式不能用於方法'布爾等於(System.Object)'的'System.Object'類型的參數'

這裏是方法:

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

在這裏,我與詮釋工作時所面臨的一個問題值,當用戶鍵入一些字符串值,如'客戶' 然後我必須找出哪個id屬於這個文本,我通過這個ID會話,然後我的幫助方法過濾它。現在我在type_id的情況下有問題。這裏一個錯誤引發,如:

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 

,我不明白是什麼走錯了這裏....

+0

其相當簡單。你傳遞int而不是system.object。檢查你的代碼通過 – qamar

+0

大小寫:state_id,你試圖使用Convert.ToInt32分配給一個可爲空的Int32,它將總是返回一個32位有符號整數。你可以用 int t來預見這個; _int = Int32.TryParse(searchText,out t)? (int?)t:null; –

回答

1

的代碼在你的錯誤不代碼爲您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。確保你正在查看的代碼是正在執行的代碼,並刪除轉換爲對象。

相關問題