Pushpendra Kuntal
Pushpendra Kuntal

Reputation: 6186

LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression

This is my controller class

public class HomeController : Controller
{
    private rikuEntities rk = new rikuEntities();
    public ActionResult Index()
    {
        var db = new rikuEntities();
        IEnumerable<SelectListItem> items = db.emp.Select(c => new     
               SelectListItem
               {
                 Value = c.Id.ToString(), 
                 Text = c.name
               });
        ViewBag.CategoryID = items;
        return View();
    }
}

this is my view

@using (Html.BeginForm("viewToController", "Home"))
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>emp</legend>

        <div class="editor-field">
            @Html.DropDownList("CategoryID", (IEnumerable<SelectListItem>) ViewBag.Categories)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

whenever I run this program I get this error:

LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression." in the statement @Html.DropDownList("CategoryID", (IEnumerable) ViewBag.Categories). i am using entity framework mechanism for databse connection. please help me to find out the error...

Upvotes: 3

Views: 4163

Answers (2)

Muhammad Alaa
Muhammad Alaa

Reputation: 618

Sadly EF does not know how to convert ToString() to an SQL statement.

You must, therefore, use the embedded function SqlFunctions.StringConvert.

There is no overload for int so you will need to typecast to double :-(

var items = from v in db.emp  
   select new SelectListItem
   {     
       Text = c.name,        
       Code = SqlFunctions.StringConvert((double)c.Id)
   }; 

Upvotes: 3

Darin Dimitrov
Darin Dimitrov

Reputation: 1038710

I would recommend you to use view models and strongly typed views instead of ViewBag. So start with defining your view model:

public class EmployeeViewModel
{
    public string CategoryId { get; set; }
    public IEnumerable<Employee> Categories { get; set; }
}

then in the controller populate this view model:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        var db = new rikuEntities();
        var model = new EmployeeViewModel
        {
            Categories = db.emp.ToArray() // <-- you probably want categories here
        };
        return View(model);
    }
}

and in the view:

@model EmployeeViewModel
@using (Html.BeginForm("viewToController", "Home"))
{
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>emp</legend>

        <div class="editor-field">
            @Html.DropDownListFor(
                x => x.CategoryId,
                new SelectList(Model.Categories, "Id", "name")
            )
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

Upvotes: 4

Related Questions