2010-09-19 5 views
1

Ok, dernière édition, promesse:LINQ InvalidOperationException lors d'une requête

Avec la classe suivante:

public partial class MembershipModule : BaseConnection<MembershipModule> 
{ 
    private const string AccessPrivilege = "Access"; 

    public bool Accessible() 
    { 
     return this.Privileges().Any(p => p.Name.Equals(AccessPrivilege)); 
    } 

    public IQueryable<MembershipAction> Privileges() 
    { 
     var privileges = from p in LinqUtil.Context.MembershipModuleActions 
         where 
          p.MembershipModule.Id.Equals(this.Id) && 
          p.MembershipRolePrivileges.Any(rp => rp.ModuleActionId.Equals(p.Id)) 
         select p.MembershipAction; 

     return privileges; 
    } 
} 

Pourquoi ce travail

public static List<MembershipModule> Collection() 
    { 
     List<MembershipModule> collection = new List<MembershipModule>(); 

     if(!MembershipUser.Connected) 
      return collection; 

     foreach(MembershipModule m in LinqUtil.Context.MembershipModules) 
     { 
      if(m.Accessible()) 
       collection.Add(m); 
     } 

     return collection; 
    } 

Bien que cela ne fonctionne pas?

public static List<MembershipModule> Collection() 
    { 
     if(!MembershipUser.Connected) 
      return new List<MembershipModule>(); 

     return LinqUtil.Context.MembershipModules.Where(m => m.Accessible()).ToList(); 
    } 
+3

Le nom de votre classe commence par un trait de soulignement et une lettre minuscule? Pouah. S'il vous plaît ne le faites pas, ce n'est même pas conforme CLS pour commencer un nom de classe avec un soulignement, sans parler du fait qu'il est moche. –

+0

oui, je pense que je basé sur les tables d'adhésion aspnet, je l'ai déjà changé, bon conseil =) – bevacqua

Répondre

2

ressemble à moi que vous essayez d'exécuter une opération linq à l'objet et il essaie de le convertir en une instruction SQL.

Gardez à l'esprit: Si cela se succede, je pense que le sql lié à l'appel que vous avez choisi se passerait une fois par MembershipModule:

return this.Privileges().Any(p => p.Name.Equals(AccessPrivilege)); 

Avez-vous essayé de sauter en utilisant la méthode accesible, et en appuyant sur les privilèges collection directement? Quelque chose comme ça le code ci-dessous. J'ai changé la déclaration de retour. Ceci est l'essentiel, peut-être pas 100% correct:

public static List<MembershipModule> Collection()  
{  
    if(!MembershipUser.Connected)  
     return new List<MembershipModule>();  

    var mod = MembershipModule.SearchById(new Guid("b012d35f-6af1-47de-9e54-e5df957c07e1"));  

    var y = from p in LinqUtil.Context.MembershipModuleActions  
      where  
       p.MembershipModule.Id.Equals(mod.Id) &&  
       p.MembershipRolePrivileges.Any(rp => rp.ModuleActionId.Equals(p.Id))  
      select p.MembershipAction;  

    var u = y.Any(p => p.Name.Equals(AccessPrivilege));  

    return LinqUtil.Context.MembershipModules.Where(m => m.Privileges().Any(p => p.Name.Equals(AccessPrivilege)).ToList(); 
} 
+1

Matter de fait, j'ai essayé et je a obtenu cette exception: Accès membre 'System.String Name' de 'Business.MembershipAction' non autorisé sur le type 'System.Linq.IQueryable'1 [Business.MembershipAction]. Mais je ne peux pas trouver une raison sur terre pourquoi ce serait "illégal" de le faire, Name est un varchar (35) qui n'accepte pas de null ... – bevacqua

+0

juste au cas où je viens d'essayer de comparer Id au lieu de Name et I obtenu le même résultat, pas légal. – bevacqua

+0

qu'est-ce que 'AccessPrivilege'? Est-ce une énumération des vôtres, ou devrait être est une chaîne?: (P => p.Nom.Equals ('AccessPrivilege')? Si c'est une énumération: Quel est le modificateur d'accès? –

0

pourrait-il avoir à faire avec une méthode statique (public static List<_membershipModule> Collection()) d'une classe d'essayer les membres d'instance d'accès (AccessPrivilege)?

+0

ne ressemble pas à cela, vérifiez mon edit à la question – bevacqua

Questions connexes