LINQ InvalidOperationException при выполнении запроса - PullRequest
1 голос
/ 20 сентября 2010

Хорошо, последнее редактирование, обещание:

Со следующим классом:

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 ]

2 голосов
/ 20 сентября 2010

выглядит так, будто вы пытаетесь выполнить операцию linq to object, и она пытается преобразовать ее в оператор sql.

Имейте в виду: если это произойдет, я ожидаю, что sqlсвязанный с следующим вызовом будет происходить один раз за MembershipModule:

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

Вы пробовали пропустить, используя метод Accesible, и напрямую попасть в коллекцию привилегий?Примерно так код ниже.Я изменил заявление о возврате.Это суть, может быть не на 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();  
}  
0 голосов
/ 20 сентября 2010

Может ли это быть связано со статическим методом (public static List<_membershipModule> Collection()) класса, пытающегося получить доступ к членам экземпляра (AccessPrivilege)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...