进行查询时出现LINQ InvalidOperationException

时间:2010-09-19 22:13:57

标签: linq linq-to-sql

好的,上次编辑,承诺:

使用以下课程:

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 个答案:

答案 0 :(得分:2)

在我看来,你正在尝试执行linq到对象操作,并且它正在尝试将其转换为sql语句。

请记住:如果这是成功的话,我希望每个MembershipModule会发生与下面调用相关的sql:

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

您是否尝试使用Accesible方法跳过并直接点击Privileges集合?像这样的代码如下。我已经更改了return语句。这是要点,可能不是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();  
}  

答案 1 :(得分:0)

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

相关问题