如何使用带有实体框架的ToString SelectListItem?

时间:2014-08-20 16:53:06

标签: c# asp.net-mvc linq entity-framework linq-to-entities

我有一些代码,如下所示。我得到了运行时异常说:

  

"类型' System.NotSupportedException'的例外情况发生在   System.Data.Entity.dll但未在用户代码中处理
      附加信息:LINQ to Entities无法识别方法' System.String ToString()'方法,这个方法不能   翻译成商店表达。"

"Value = sup.SupplierID.ToString()""Value = cat.CategoryID.ToString()"导致的异常原因似乎实体框架无法使用ToString()生成表达式树,但对于SelectListItem,我必须给它一个字符串。

谁能提供简单的解决方案将非常感谢。


namespace MvcApplication1.Models
{
    public class ProductEditViewModel : Product
    {
        public IEnumerable<SelectListItem> SupplierDropDownItems { get; set; }
        public IEnumerable<SelectListItem> CategorieDropDownitems { get; set; }
    }
}


[HttpGet]
public ActionResult ProductEdit(Int32 ProductId)
{
    var northwind = new NorthwindEntities();

    var q = from p in northwind.Products
            where p.ProductID == ProductId
            select new ProductEditViewModel
            {
                ProductID = p.ProductID,
                ProductName = p.ProductName,
                UnitPrice = p.UnitPrice,
                SupplierDropDownItems = from sup in northwind.Suppliers select new SelectListItem { Text = sup.CompanyName, Value = sup.SupplierID.ToString(), Selected = p.Supplier.SupplierID == p.SupplierID },
                CategorieDropDownitems = from cat in northwind.Categories select new SelectListItem { Text = cat.CategoryName, Value = cat.CategoryID.ToString(), Selected = p.Category.CategoryID == p.CategoryID },
                Discontinued = p.Discontinued
            };

    return View(q.SingleOrDefault());
}


<div class="form-group">
    @Html.LabelFor(model => model.SupplierID, "SupplierID", htmlAttributes: new { @class = "control-label col-md-2" })
    <div class="col-md-10">
        @Html.DropDownList("SupplierID", Model.SupplierDropDownItems, htmlAttributes: new { @class = "form-control" })
        @Html.ValidationMessageFor(model => model.SupplierID, "", new { @class = "text-danger" })
    </div>
</div>

3 个答案:

答案 0 :(得分:1)

使用SqlFunctions.StringConvert之类的:

Value = SqlFunctions.StringConvert((double)cat.CategoryID)

另一个选项是枚举内存中的所有记录,然后使用ToString,如:

from sup in northwind.Suppliers.AsEnumerable()
select new SelectListItem { Text = sup.CompanyName, Value = sup.SupplierID.ToString(), Selected = p.Supplier.SupplierID == p.SupplierID },

AsEnumerable将从数据库中获取所有记录并将其加载到内存中,因此不需要调用ToString来转换为SQL。

答案 1 :(得分:1)

而不是.ToString(),用户Convert.ToString(您的值);

答案 2 :(得分:1)

您似乎正在使用旧版本的EF - 较新版本的Entity Framework支持ToString()(从版本6.1开始)

参见EF 6.1的Release Notes

  

EF6.1中的内容

     

EF6.1增加了以下新功能:
  [...]

     
      
  • 在LINQ查询中支持.ToString,String.Concat和enum HasFlags。
  •