2013-02-08 3 views
2

Я пытаюсь вставить selectList в представление (форму). Я решил, что сделаю это, заполнив список в контроллере и отправив его на просмотр в виде сумки. Вот что я получил до сих пор:SelectListItem сбой при загрузке

var query = from p in db.ProductCategories 
         join pt in db.ProductCategoriesTranslations on p.ProductCategoriesId equals pt.ProductCategoriesId 
         where pt.ProductLanguage.Equals("se") 
         orderby pt.ProductCategoriesName 
         select new SelectListItem 
         { 
          Value = p.ProductCategoriesId.ToString(), 
          Text = pt.ProductCategoriesName 
         }; 

      ViewBag.ProductCategoriesId = query; 
      return View();  

Тогда в представлении у меня есть:

@Html.DropDownList("ProductCategoriesId", String.Empty) 

Я думал, что это было просто и понятно, но когда я загружаю вещь он падает со следующей ошибкой:

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

Любые предложения?

ответ

0

Linq к SQL не может перевести ToString() на любую команду SQL. Это понятно. Вы должны выполнить свой запрос, прежде чем преобразовывать их в SelectListItems (или избежать вызова ToString()). Например.

var query = from p in db.ProductCategories 
         join pt in db.ProductCategoriesTranslations on p.ProductCategoriesId equals pt.ProductCategoriesId 
         where pt.ProductLanguage.Equals("se") 
         orderby pt.ProductCategoriesName; 
         select new { Id = p.ProductCategoriesId, Name = pt.ProductCategoriesName }; 

ViewBag.ProductCategoriesId = query.ToList().Select(p =>   
         new SelectListItem 
         { 
          Value = p.Id.ToString(), 
          Text = p.Name 
         }); 

Пожалуйста, обратите внимание, что Linq2Sql оценивает выражение при вызове query.ToList(). До этого момента не работает SQL.

Другая проблема описана в ответе Leniel Macaferi.

Update

Becase целевой технология изменила (вопрос тэга), так как мой ответ, который я могу предложить вам другой подход тоже:

Вы можете использовать SqlFunctions.StringConvert вместо ToString в запросе LINQ и EF может перевести это.

+0

Спасибо, это сработало, однако оно работало без коррекции в представлении, поэтому этот код работает, хотя он не должен? '@ Html.DropDownList (" ProductCategoriesId ", string.Empty)' – Dennis

+1

Возможно, он по умолчанию использует ViewBag. Я не знал этого, потому что я всегда использую ViewModels для своих просмотров. –

+0

Я попробовал SqlFunctions.StringConvert раньше, но получил еще одно сообщение об ошибке. Я предполагаю, что в основном я не знаю, как правильно его реализовать. Тем не менее, есть ли преимущество в использовании этого решения, которое вы предоставили? – Dennis

0

Вы не используете собственность ViewBag, созданное в контроллере.

ли это вместо:

@Html.DropDownList("ProductCategoriesId", 
        ViewBag.ProductCategoriesId as SelectList, 
        string.Empty) 
Смежные вопросы