Cómo especificar qué columnas se pueden devolver de la consulta linq a sql
-
06-07-2019 - |
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.
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.