Pregunta

Estoy tratando de devolver solo unas pocas columnas de una consulta de linq a sql, pero si lo hago, arroja la excepción:

La construcción explícita del tipo de entidad 'InVision.Data.Employee' en la consulta no está permitida

Aquí está el código:

return db.Employees.Select(e => new Employee()
       { EmployeeID = e.EmployeeID, FirstName = e.FirstName,
         LastName = e.LastName }).ToList();

Si devuelvo todo, arrojará excepciones sobre referencias circulares porque necesita ser serializado para usarse en JavaScript, por lo que realmente necesito limitar las columnas ... Gracias por cualquier consejo que me puedan dar para resolver esto.

¿Fue útil?

Solución

Básicamente, si solo desea las columnas, selecciónelas. Si desea la entidad del empleado, selecciónela. No hay mucho terreno intermedio aquí. Recomiendo no crear una nueva clase solo por esto. ¡Qué asco!

Haz esto:

return db.Employees
   .Select(e => new { e.EmployeeID, e.FirstName, e.LastName })
   .ToList();

Otros consejos

Debido a que he tenido que luchar con Linq2Sql y Serialization antes, recomendaría usar un objeto View para manejar este escenario en lugar de una Entidad Linq2Sql. Es una solución mucho más fácil:

return db.Employees
        .Select( e => new EmployeeView() 
        { 
            EmployeeID = e.EmployeeID, 
            FirstName = e.FirstName, 
            LastName = e.LastName 
         }).ToList();

La otra alternativa es arrastrar una nueva copia de su tabla de empleados al diseñador DBML, asígnele un nombre diferente como SimpleEmployee, elimine todas las relaciones y elimine todas las columnas que no necesita.

Justin,

Explicación de ese error aquí: http: // devlicio.us/blogs/derik_whittaker/archive/2008/04/25/linq2sql-explicit-construction-of-entity-exception.aspx

Una cosa que puede hacer es crear una clase que se recupere del Empleado.

public class EmployeeProxy : Employee
{
}

entonces puedes hacer tu consulta:

return db.Employees.Select(e => new EmployeeProxy { EmployeeID=e.EmployeeID, FirstName=e.FirstName, LastName=e.LastName }).ToList();

Por otro lado, si solo necesita serializar el conjunto de resultados a javascript, también puede usar clases anónimas. Esto también funciona:

return db.Employees.Select(e => new { EmployeeID=e.EmployeeID, FirstName=e.FirstName, LastName=e.LastName }).ToList();

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top