LINQ to Entities поддерживает только листинг примитивных типов Entity Data Model?
Я пытаюсь заполнить раскрывающийся список в моем представлении. Любая помощь приветствуется. Спасибо.
Ошибка:
Невозможно ввести тип "System.Int32" для ввода "System.Object".
LINQ to Entities поддерживает только моделирование примитивных типов данных Entity Data Model.
Контроллер:
ViewBag.category = (from c in new IntraEntities().CategoryItems
select new SelectListItem() {Text=c.Name, Value=""+c.ID }).ToList<SelectListItem>();
Вид:
Category:<br />@Html.DropDownList("category", (List<SelectListItem>)ViewBag.category)
Ответы
Ответ 1
Как насчет этого:
ViewBag.category =
from c in new IntraEntities().CategoryItems.ToList()
select new SelectListItem
{
Text = c.Name,
Value = c.ID.ToString()
};
и как насчет использования сильно типизированных моделей представлений вместо некоторого слабо типизированного дерьма ViewBag (как я его называю)?
Вот так:
public class CategoryViewModel
{
public string CategoryId { get; set; }
public IEnumerable<SelectListItem> Categories { get; set; }
}
то
public ActionResult Foo()
{
var model = new CategoryViewModel
{
Categories =
from c in new IntraEntities().CategoryItems.ToList()
select new SelectListItem
{
Text = c.Name,
Value = c.ID.ToString()
}
};
return View(model);
}
и, наконец, в вашем строго типизированном виде:
@model CategoryViewModel
@using (Html.BeginForm())
{
@Html.DropDownListFor(x => x.CategoryId, Model.Categories)
<button type="submit">OK</button>
}
Гораздо лучше, не так ли?
Ответ 2
Вы можете отправить запрос в .AsEnumerable() перед преобразованием, чтобы заставить Linq использовать объекты для кастинга, но лучше использовать SQL-совместимые функции, доступные в System.Data.Objects.SqlClient.SqlFunctions так:
(from c in new IntraEntities().CategoryItems
select new SelectListItem() {
Text = c.Name,
Value = SqlFunctions.StringConvert((double)c.ID).TrimStart()
})
Ответ 3
ViewBag.category = (from c in new IntraEntities().CategoryItems
select new SelectListItem {Text=c.Name, Value=c.ID.ToString()})
.ToList<SelectListItem>();
Ответ 4
Ошибка говорит, что вы пытаетесь выполнить строку с целым значением. Это невозможно в запросе linq.
Для преобразования int в строку вы можете использовать
SqlFunctions.StringConvert((decimal?)intProperty)
Ответ 5
вы можете использовать SQL-функции для преобразования следующим образом:
ViewBag.category = (from c in new IntraEntities().CategoryItems
select new SelectListItem() {
Text=c.Name,
Value=SqlFunctions.StringConvert((double) c.ID) }).ToList<SelectListItem>();
но не забудьте включить это пространство имен в начало файла:
используя System.Data.Objects.SqlClient;
Ответ 6
Да, вы пытаетесь "конкатрировать строку с целочисленным значением. Это невозможно в запросе linq", как предположил Налан М. Убедитесь, что это столбец в базе данных, который вы пытаетесь получить. Для меня это то, что было. Я указывал неправильную колонку. Я называл этот класс, потому что, по-видимому, кто-то сделал класс для этого свойства. Если вы работаете в visual studio, вы можете проверить базу данных и посмотреть, что именно вы вызываете. Таким образом, вы можете ответить на вопрос: "Где колонка, которую я хочу?" в базе данных.