Como especificar quais colunas podem ser devolvidos a partir de LINQ to SQL consulta
-
06-07-2019 - |
Pergunta
Eu estou tentando retornar apenas algumas colunas de uma consulta LINQ to SQL, mas se eu fizer isso, ele lança a exceção:
construção explícita do tipo de entidade 'InVision.Data.Employee' na consulta não é permitido
Aqui está o código:
return db.Employees.Select(e => new Employee()
{ EmployeeID = e.EmployeeID, FirstName = e.FirstName,
LastName = e.LastName }).ToList();
Se eu voltar tudo, então ele irá lançar exceções sobre referências circulares porque ele precisa ser serializado para ser usado em javascript, então eu realmente precisa limitar as colunas ... Obrigado por todas as dicas que você pode me dar para resolver isso.
Solução
Basicamente, se você quiser apenas as colunas, selecionar aqueles. Se você quiser a entidade empregado, selecione-o. Não há muito de um meio termo aqui. Eu recomendo contra a criação de uma nova classe apenas para isso. Yuck!
Faça o seguinte:
return db.Employees
.Select(e => new { e.EmployeeID, e.FirstName, e.LastName })
.ToList();
Outras dicas
Porque eu tive que lutar com Linq2Sql e serialização antes de eu recomendo usar um objeto de exibição para lidar com este cenário, em vez de uma Entidade Linq2Sql. É uma solução muito mais fácil:
return db.Employees
.Select( e => new EmployeeView()
{
EmployeeID = e.EmployeeID,
FirstName = e.FirstName,
LastName = e.LastName
}).ToList();
A outra alternativa é arrastar uma nova cópia de sua tabela Employee para o designer DBML, nomeá-la algo diferente, como SimpleEmployee, apagar todos os relacionamentos e remover todas as colunas que você não precisa.
Justin,
Explicação desse erro aqui: http: // devlicio.us/blogs/derik_whittaker/archive/2008/04/25/linq2sql-explicit-construction-of-entity-exception.aspx
Uma coisa que você pode fazer é criar uma classe que derrives fora de Employee.
public class EmployeeProxy : Employee
{
}
então você pode fazer sua consulta:
return db.Employees.Select(e => new EmployeeProxy { EmployeeID=e.EmployeeID, FirstName=e.FirstName, LastName=e.LastName }).ToList();
Por outro lado, se você só precisa serializar o conjunto de resultados para javascript, então você também pode simplesmente usar classes anônimas. Isso funciona bem:
return db.Employees.Select(e => new { EmployeeID=e.EmployeeID, FirstName=e.FirstName, LastName=e.LastName }).ToList();
Espero que isso ajude.