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, вы можете проверить базу данных и посмотреть, что именно вы вызываете. Таким образом, вы можете ответить на вопрос: "Где колонка, которую я хочу?" в базе данных.