none
{"LINQ to Entities 不识别方法“System.String ToString(Int32)”,因此该方法无法转换为存储表达式。"},请问如何解决? RRS feed

  • 问题

  • 提取列表数据的语句,其中表MovieGenres的id字段是数值型的

               ViewData["MovieGenres"] = from a in db.MovieGenres
                                      orderby a.Name
                                      select new SelectListItem
                                      {
                                          Text = a.Name,
                                          Value = a.ID.toString()
                                      };

    执行的时候报错
    {"LINQ to Entities 不识别方法“System.String ToString(Int32)”,因此该方法无法转换为存储表达式。"}这样写编译通不过
    如果改成 Value = a.ID 编译通不过,说不支持int类型

    2014年6月5日 8:26

答案

  • 也可以使用匿名类,这样更简单

    var MovieGenresQry = from a in db.MovieGenres
                                               orderby a.Name
                                               select new
                                               {
                                                   Text = a.Name,
                                                   Value = a.ID
                                               }
                                         ;


     ViewData["MovieGenres"] = new SelectList(MovieGenresQry, "Value", "Text");


    • 已标记为答案 尺蠖 2014年6月9日 7:06
    • 已编辑 尺蠖 2014年6月9日 8:51
    2014年6月9日 7:05

全部回复

  • LINQ to Entities 对能转换成存储表达式的方法有些限制,基本上绝大多数的 .Net 方法都无法通过编译。

    你应该检查你的 SelectListItem 的 Value 是什么数据类型。

    2014年6月6日 1:09
  • 请问如何检查?

    SelectListItem 中德value都是字符串型啊

    2014年6月6日 2:41
  • 请问如何检查?

    SelectListItem 中德value都是字符串型啊

    class SelectListItem

    {

      public string Text{get;set;}

     public string Value{get;set;}

     }

    select new SelectListItem
                                      {
                                          Text = a.Name,
                                          Value = a.ID
                                       };

    上面的组合编译不通过,“说不支持int类型”,下面的组合能编译通过,因为我们把 Value 改成了 int 类型。这下你能明白我的意思吗?

    class SelectListItem

    {

      public string Text{get;set;}

     public int Value{get;set;}

     }

    select new SelectListItem
                                      {
                                          Text = a.Name,
                                          Value = a.ID
                                       };

    2014年6月6日 3:08
  • 把SelectListItem类的属性改了,这确实是个好方法,谢谢

    2014年6月6日 9:27
  •     var  result   =   (from a in db.MovieGenres
                                                orderby a.Name
                                                select new 
                                                {
                                                    a.ID,
                                                    a.Name
                                                }) 
                                                ;
                List<SelectListItem> deptSelectItems = new List<SelectListItem>();  
    
                 foreach (var d in result)
                 {
                     SelectListItem item = new SelectListItem();
                     item.Text = d.Name;
                     item.Value = d.ID.ToString();
                     item.Selected = false;
                     deptSelectItems.Add(item);
                 }
    
                 ViewData["MovieGenres"] = deptSelectItems;

    从其他文章找到点借鉴,对SelectListItem的填充使用普通方式,不用Linq,这个问题就能解决

    修改把SelectListItem类的属性是个好方法,但是万一有两个列表,value属性不一样就不好操作了

    2014年6月6日 9:53
  • 又看了一下,可以定义一个继承类,修改属性,这样就兼容各种列表了

        class NewSelectListItem:SelectListItem
            {

                public string Text { get; set; }

                public int Value { get; set; }

            }

     

       var MovieGenresQry = from a in db.MovieGenres
                                      orderby a.Name
                                      select new NewSelectListItem
                                      {
                                          Text = a.Name,
                                          Value = a.ID
                                      }
                           ;

                 ViewData["MovieGenres"] = new SelectList(MovieGenresQry, "Value", "Text");

    2014年6月6日 12:23
  • 也可以使用匿名类,这样更简单

    var MovieGenresQry = from a in db.MovieGenres
                                               orderby a.Name
                                               select new
                                               {
                                                   Text = a.Name,
                                                   Value = a.ID
                                               }
                                         ;


     ViewData["MovieGenres"] = new SelectList(MovieGenresQry, "Value", "Text");


    • 已标记为答案 尺蠖 2014年6月9日 7:06
    • 已编辑 尺蠖 2014年6月9日 8:51
    2014年6月9日 7:05