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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top