Error: la entidad o el tipo complejo no se puede construir en una consulta de LINQ to Entities

Recibo este error "System.NotSupportedException: la entidad o el tipo complejo 'MyModel.Team' no se puede construir en una consulta LINQ to Entities". cuando navego a la página Equipo / Índice / {id}. ¿Alguien puede señalarme el error que cometí, por favor?

Controlador:

public ActionResult Index(int id)
    {
        IQueryable<Team> teams = teamRepository.GetTeamByPersonID(id);   
        return View("Index", teams);
    }

Repositorio:

public IQueryable<Team> GetTeamByPersonID(int id)
    {
        return from t in entities.Teams
               join d in entities.Departments
                on t.TeamID equals d.TeamID
               where (from p in entities.Person_Departments
                      join dep in entities.Departments
                      on p.DepartmentID equals dep.DepartmentID
                      where p.PersonID == id
                      select dep.TeamID).Contains(d.TeamID)
               select new Team
               {
                   TeamID = t.TeamID,
                   FullName = t.FullName,
                   ShortName = t.ShortName,
                   Iso5 = t.Iso5,
                   DateEstablished = t.DateEstablished,
                   City = t.City,
                   CountryID = t.CountryID
               };
    }

ViewModel:

public IQueryable<Team> teamList { get; set; }
public TeamViewModel(IQueryable<Team> teams)
    {
         teamList = teams;
    }

Vista

<% foreach (var team in Model){ %>
    <tr>
        <td><%: Html.ActionLink(team.ShortName, "Details", new { id=team.TeamID}) %></td>
        <td><%: team.City %></td>
        <td><%: team.Country %></td>
    </tr>
<% } %>

preguntado el 27 de agosto de 11 a las 15:08

2 Respuestas

El problema es que estás creando un Team clase en un select declaración, que no es compatible con LINQ to SQL. Cambia tu select a:

select t

o use un tipo anónimo:

select new
{
    TeamID = t.TeamID,
    FullName = t.FullName,
    ShortName = t.ShortName,
    Iso5 = t.Iso5,
    DateEstablished = t.DateEstablished,
    City = t.City,
    CountryID = t.CountryID
};

o use un DTO (cualquier cosa que no sea una entidad):

select new TeamDTO
{
    TeamID = t.TeamID,
    FullName = t.FullName,
    ShortName = t.ShortName,
    Iso5 = t.Iso5,
    DateEstablished = t.DateEstablished,
    City = t.City,
    CountryID = t.CountryID
};

Respondido 27 ago 11, 19:08

¡Gracias por la respuesta detallada! - Zar

Si clase Team es una entidad, no se puede crear dentro de una declaración linq. Debería considerar crear su propia clase y devolverla en su lugar. O tal vez solo select t.

Respondido 27 ago 11, 19:08

¿Alguien puede explicar la razón en detalle? - Rikin Patel

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.