Ошибка Linq To Entites: сущность или сложный тип не могут быть созданы в запросе LINQ to Entities

Я рвал на себе волосы, пытаясь выполнить учебник MVC 3 Music Store, найденный на веб-сайте asp.net. В приведенном ниже коде я пытаюсь использовать запрос Linq to Entities для возврата результатов в представление просмотра из storeController, но получаю следующую ошибку при переходе на страницу просмотра: Сущность или сложный тип «MvcMusicStore.Models. Жанр нельзя создать в запросе LINQ to Entities.

Приведенный ниже код работает, когда я использую выражение Lambda, которое они используют в учебнике, но мне удобнее использовать Linq Query. Пожалуйста, может кто-нибудь объяснить мне, почему это не работает, используя следующий код?

Storecontoller.cs

MusicStoreEntities storeDB = new MusicStoreEntities();
    public ActionResult Browse(string genre)
    {

        //working code used in tutorial
        //var genreModel = storeDB.Genres.Include("Albums")
        //.Single(g => g.Name == genre);

        storeDB.Genres.Include("Albums");
        var genreModel = from p in storeDB.Genres
                         where p.Name == genre
                         select new Genre
                         {
                          GenreId = p.GenreId,
                          Name = p.Name,
                          Description = p.Description,
                          Albums = p.Albums
                         };


        return View(genreModel.Single());

    }

Жанр.cs

using System.Collections.Generic;
namespace MvcMusicStore.Models
{
    public class Genre
    {
        public int GenreId { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
        public List<Album> Albums { get; set; }
    }
}

MusicStoreEntities.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Entity;

namespace MvcMusicStore.Models
{
    public class MusicStoreEntities : DbContext
    {
        public DbSet<Album> Albums { get; set; }
        public DbSet<Genre> Genres { get; set; }
    }

}

browse.cshtml

<h2>Browsing Genre: @Model.Name</h2>
<ul>
    @foreach (var album in Model.Albums)
    {
        <li>
            @album.Title
        </li>
    }
</ul>

Большое спасибо, отчаянный Дэйв


person davey    schedule 05.04.2011    source источник


Ответы (1)


Вы должны использовать это:

var genreModel = from p in storeDB.Genres.Include("Albums")
                 where p.Name == genre
                 select p;
return View(genreModel.Single());

Include должен быть частью запроса. Заранее позвонить не получится. Ты можешь это сделать:

var query = storeDB.Genres.Include("Albums");
var genreModel = from p in query
                 where p.Name == genre
                 select p;

Также вы не можете создать проекцию на класс сущностей (new Genre). Вы должны выбрать его напрямую.

person Ladislav Mrnka    schedule 05.04.2011
comment
Кажется, я пробовал это раньше. Я попробую и доложу вам, спасибо за ответ - person davey; 06.04.2011
comment
Согласованный. Проекции не разрешены в Linq to EF, если я правильно помню. - person neontapir; 06.04.2011
comment
@neon: проекция разрешена, но вы не должны проецировать на сопоставленный объект. - person Ladislav Mrnka; 06.04.2011