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

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

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

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());

    }

Genre.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>

Большое спасибо отчаянному Дейву

1 Ответ

3 голосов
/ 06 апреля 2011

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

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). Вы должны выбрать его напрямую.

...