2009-09-22 8 views
0

Je rencontre un problème de mappage. Je lisais post ScottGu des « données de mise en forme des caractéristiques » - http://weblogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-3-querying-our-database.aspxlinq2sql: La construction explicite du type d'entité '# some type #' dans la requête n'est pas autorisée - également en utilisant la jointure

mais je l'ai essayé

 IQueryable<AccessRights> accessRights = 
          from t1 in this.db.AccessRights 
          join t2 in this.db.AccessRightsExtra 
          on t1.IdAccessRights equals t2.IdAccessRights 
          where t2.IdUser== userId 
          select new AccessRights 
          { 
           IdAccessRights = t1.IdAccessRights, 
           Description= t2.Description 
          }; 

mais produit cette erreur « construction explicite de type d'entité « #some de type # » dans la requête n'est pas autorisée "

Comme par poste scottgus en lien ci-dessus j'ai essayé (avis de type portés disparus après le nouveau en sélection)

 IQueryable<AccessRights> accessRights = 
          from t1 in this.db.AccessRights 
          join t2 in this.db.AccessRightsExtra 
          on t1.IdAccessRights equals t2.IdAccessRights 
          where t2.IdUser== userId 
          select new 
          { 
           IdAccessRights = t1.IdAccessRights, 
           Description= t2.Description 
          }; 

mais ce produ

Impossible de convertir implicitement le type 'System.Linq.IQueryable' en 'System.Linq.IQueryable'. Une conversion explicite existe (manque-t-il une distribution?)

Vraiment apprécier tout aperçu que tout le monde a.

Répondre

4

Que diriez-vous:

IEnumerable<AccessRights> accessRights = 
    // This bit works in the database 
    (from t1 in this.db.AccessRights 
    join t2 in this.db.AccessRightsExtra 
    on t1.IdAccessRights equals t2.IdAccessRights 
    where t2.IdUser== userId 
    select new 
    { 
     IdAccessRights = t1.IdAccessRights, 
     Description= t2.Description 
    }) 
    .AsEnumerable() // From here on it's in-process 
    .Select(x => new AccessRights 
      { 
       IdAccessRights = x.IdAccessRights, 
       Description= x.Description 
      }); 

Notez que le résultat est IEnumerable<T> plutôt que IQueryable<T>, mais il sera toujours évalué paresseusement. Cela va-t-il causer un problème?

Sinon, il suffit d'utiliser le type anonyme en utilisant une variable locale implicitement typée:

var accessRights = from t1 in this.db.AccessRights 
        join t2 in this.db.AccessRightsExtra 
        on t1.IdAccessRights equals t2.IdAccessRights 
        where t2.IdUser== userId 
        select new 
        { 
         IdAccessRights = t1.IdAccessRights, 
         Description= t2.Description 
        }; 

Ce sera toujours un IQueryable<T> mais où T est un type anonyme. Vous ne serez pas en mesure de l'utiliser comme un IQueryable<AccessRights> mais si tout ce que vous avez besoin est les propriétés IdAccessRights et Description, et il vous suffit eux dans la même méthode, il pourrait être assez bon pour vous ...

+0

Merci Jon! .. oui le second fonctionne, le problème est que j'ai besoin de le lancer à IQueryable donc j'ai essayé ce qui suit mais le test est nul. IQueryable test = accessRights en tant que IQueryable ; Existe-t-il un moyen spécial de le transtyper sur mes IQueryable? Les noms de colonne dans le type anonyme sont exactement les mêmes que les AccessRights? –

0

Il est possible , si vous créez une nouvelle classe dérivée sans [tableau] -attribut comme ceci:

public class AccessRightsLocal : AccessRights 
{ 
} 

Ensuite, vous pouvez créer une instance de « AccessRightsLocal » à l'intérieur de la sélection. Cast la nouvelle instance à "AccessRights" et cela fonctionnera!

IQueryable<AccessRights> accessRights = 
        from t1 in this.db.AccessRights 
        join t2 in this.db.AccessRightsExtra 
        on t1.IdAccessRights equals t2.IdAccessRights 
        where t2.IdUser== userId 
        select (AccessRights) new AccessRightsLocal 
        { 
         IdAccessRights = t1.IdAccessRights, 
         Description= t2.Description 
        }; 
Questions connexes