Question

J'essaie de ne renvoyer que quelques colonnes d'une requête linq à sql, mais si je le fais, une exception est générée:

La construction explicite du type d'entité 'InVision.Data.Employee' dans la requête n'est pas autorisée

Voici le code:

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

Si je retourne tout, il générera des exceptions concernant les références circulaires car il doit être sérialisé pour pouvoir être utilisé en javascript. J'ai donc vraiment besoin de limiter le nombre de colonnes ... Merci pour tout conseil que vous pouvez me donner pour résoudre ce problème.

Était-ce utile?

La solution

En gros, si vous voulez juste les colonnes, sélectionnez-les. Si vous voulez l'entité salariée, sélectionnez-la. Il n'y a pas beaucoup de terrain d'entente ici. Je recommande contre la création d'une nouvelle classe juste pour cela. Beurk!

Faites ceci:

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

Autres conseils

Parce que j’ai dû me battre avec Linq2Sql et la sérialisation avant de recommander l’utilisation d’un objet View pour gérer ce scénario plutôt que d’une entité Linq2Sql. C'est une solution beaucoup plus simple:

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

L’autre solution consiste à faire glisser une nouvelle copie de votre table des employés dans le concepteur DBML, à lui donner un nom différent, tel que SimpleEmployee, à supprimer toutes les relations et à supprimer toutes les colonnes inutiles.

Justin,

Explication de cette erreur ici: http: // devlicio.us/blogs/derik_whittaker/archive/2008/04/25/linq2sql-explicit-construction-of-entity-exception.aspx

Une chose à faire est de créer une classe qui dérive d’employé.

public class EmployeeProxy : Employee
{
}

alors vous pouvez faire votre requête:

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

D'autre part, si vous avez seulement besoin de sérialiser le jeu de résultats en javascript, vous pouvez également utiliser des classes anonymes. Cela fonctionne aussi bien:

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

J'espère que cela vous aidera.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top