代码之家  ›  专栏  ›  技术社区  ›  bevacqua

进行查询时出现Linq InvalidOperationException

  •  1
  • bevacqua  · 技术社区  · 15 年前

    好的,最后一次编辑,承诺:

    使用以下类:

    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;
        }
    }
    

    为什么这么做

        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;
        }
    

    而这不是?

        public static List<MembershipModule> Collection()
        {
            if(!MembershipUser.Connected)
                return new List<MembershipModule>();
    
            return LinqUtil.Context.MembershipModules.Where(m => m.Accessible()).ToList();
        }
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   brian chandley    15 年前

    在我看来,您正在尝试执行Linq to对象操作,它正在尝试将其转换为SQL语句。

    请记住:如果此操作成功,我预计与以下调用相关的SQL将在每个成员身份模块上发生一次:

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

    是否尝试使用可访问的方法跳过,并直接命中特权集合?类似于下面的代码。我已经更改了报税表。这是要点,可能不是100%正确:

    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();  
    }  
    
        2
  •  0
  •   Jonathan Bates    15 年前

    这和静态方法有关吗?( public static List<_membershipModule> Collection() )尝试访问实例成员的类( AccessPrivilege )?