2009-05-28 6 views
2

Je reçois cette erreur à GridView1.DataBind();ERREUR LINQ: construction explicite du type d'entité

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

using (var db = new UsersDataContext()) 
      { 
       IEnumerable<MUser> user = from u in db.MUsers 
              where u.Id == 1 
              select new MUser {Username = u.Username, Id = u.Id, Password=u.Password, ProjectUsers=u.ProjectUsers }; 

       GridView1.DataSource = user; 

       GridView1.DataBind(); 

      } 

comment résoudre ce problème?

je suis suivant ce tutoriel http://weblogs.asp.net/scottgu/archive/2007/04/21/new-orcas-language-feature-query-syntax.aspx

+0

Quel est le code pour muser ressembler? –

Répondre

0

Si vous voulez retourner le plein objet Muser il suffit d'utiliser:

using (var db = new UsersDataContext()) 
     { 
      IEnumerable<MUser> user = from u in db.MUsers 
             where u.Id == 1 
             select u; 

      GridView1.DataSource = user; 

      GridView1.DataBind(); 

     } 

alternativement, si vous voulez retourner une partie personnalisée de l'utilisateur (c.-à- seulement certaines propriétés de l'objet Muser) vous pouvez utiliser le type anonyme comme suit.

using (var db = new UsersDataContext()) 
     { 
      IEnumerable<MUser> user = from u in db.MUsers 
             where u.Id == 1 
             select new {Username = u.Username, Id = u.Id, Password=u.Password, ProjectUsers=u.ProjectUsers }; 

      GridView1.DataSource = user; 

      GridView1.DataBind(); 

     } 
+0

Ce second exemple ne fonctionnera pas. Le compilateur se plaindra de ne pas pouvoir convertir un type anonyme en type MUser. Rappelez-vous que les types anonymes sont 100% inutilisables en dehors de leur contexte initial, petit. Ces anonymes ont une utilité très limitée et spécifique et ne devraient jamais être retournés directement à partir d'une requête pour cette raison. –

1

mais le type anonyme ne peut pas sérialiser dans WCF.

0

Vous ne pouvez pas construire un type d'entité dans une requête. MS pense que les développeurs sont trop bêtes et vont se confondre (entre autres choses). Un rapide, facile et inefficace ... fix

using (var db = new UsersDataContext()) 
     { 
      IEnumerable<MUser> user = from u in db.MUsers.AsEnumerable() 
             where u.Id == 1 
             select new MUser {Username = u.Username, Id = u.Id, Password=u.Password, ProjectUsers=u.ProjectUsers }; 

      GridView1.DataSource = user; 

      GridView1.DataBind(); 

     } 

Je ne recommanderais pas cela pour un environnement de produit tel qu'il chargera toute la table, mais je l'ai utilisé pour une application interne pour un usage personnel. Je recommanderais de créer un modèle surchargé.

2

Si vous vous souciez de la performance, vous devez modifier la requête:

using (var db = new UsersDataContext()) 
     { 
     IEnumerable<MUser> user = from x in 
            (from u in db.MUsers 
            where u.Id == 1 
            select u).AsEnumerable() 
           select new MUser { Username = x.Username, Id = x.Id, Password = x.Password, ProjectUsers = x.ProjectUsers }; 

     GridView1.DataSource = user; 
     GridView1.DataBind(); 
     } 
Questions connexes