实体框架:基于最后一级子实体的过滤器

我有以下代表简单关系的实体类。

user => NetworkRoles => NetworkRolePrivilege => UserPrivilege

class user 
{     
    protected ICollection<UserNetworkRole> 
    NetworkRoles{ get; set; }
}

class NetworkRoles
{
  public ICollection<NetworkRolePrivilege> NetworkRolePrivilege { get; set; }
}

class NetworkRolePrivilege
{    
   public  UserPrivilege UserPrivilege { get; set; }
}

class UserPrivilege
{    
     public bool Enabled { get; set; }
}

我想从UserPrivilege表中获取具有Enabled标志为true的用户。我无法获取LINQ查询。以下是我尝试的代码片段。

db.user.Where(x=>x.NetworkRoles.Where(m=>m.NetworkRolePrivilege.Where(k=>k.UserPrivilege.Enabled))) // does not work due to last where condition.

以下操作无效,因为未定义导航属性

db.user.Include(x => x.NetworkRoles.Select(m => m.NetworkRolePrivilege.Select(l => l.UserPrivilege.Enabled)))

通过一些搜索,我发现我们需要为其使用投影,但无法获取。

var query = db.user.Select(x=>new 
                {
                    user = x,networkRolePrivilege = x.NetworkRoles.SelectMany(n=>n.NetworkRolePrivilege.Where(m=>m.UserPrivilege.Enabled))
                }).....

请帮助Linq查询,以使用户启用UserPrivilege = true

预先感谢

更新

由于NetworkRoles不直接是映射属性或导航属性,文斯答案给出了以下错误

System.NotSupportedException:在LINQ to Entities中不支持指定的类型成员'NetworkRoles'。仅支持初始化程序,实体成员和实体导航属性。'

web335 回答:实体框架:基于最后一级子实体的过滤器

尝试

using System;
using System.Collections.Generic;
using System.Linq;

namespace TestThings
{
    class Program
    {
        static void Main(string[] args)
        {
            List<User> users = new List<User>() {
                new User(){
                    Name = "User1",NetworkRoles = new List<NetworkRole>() {
                        new NetworkRole(){
                            Description = "NetworkRole1",NetworkRolePrivileges = new List<NetworkRolePrivilege>() {
                            new NetworkRolePrivilege(){
                                Description = "NetworkRolePrivilege1",UserPrivilege = new UserPrivilege(){
                                    Description = "NetworkRolePrivilege",Enabled = false
                                }
                            }
                        }
                        }
                    }
                },new User(){
                    Name = "User2",NetworkRoles = new List<NetworkRole>() {
                        new NetworkRole(){
                            Description = "NetworkRole2",NetworkRolePrivileges = new List<NetworkRolePrivilege>() {
                            new NetworkRolePrivilege(){
                                Description = "NetworkRolePrivilege2",UserPrivilege = new UserPrivilege(){
                                    Description = "NetworkRolePrivilege3",Enabled = true
                                }
                            }
                        }
                        }
                    }
                }
            };

            var _users = users.Where(u=> u.NetworkRoles.SelectMany(x=>x.NetworkRolePrivileges).Where(x=>x.UserPrivilege.Enabled).Any()).ToList();

            foreach(var u in _users)
            {
                Console.WriteLine(u.Name);
            }

            Console.ReadKey();
        }
    }

    class User
    {
        public string Name { get; set; }
        public ICollection<NetworkRole> NetworkRoles { get; set; } = new List<NetworkRole>();
    }

    class NetworkRole
    {
        public string Description { get; set; }
        public ICollection<NetworkRolePrivilege> NetworkRolePrivileges { get; set; }
    }

    class NetworkRolePrivilege
    {
        public string Description { get; set; }
        public UserPrivilege UserPrivilege { get; set; }
    }
    class UserPrivilege
    {
        public string Description { get; set; }
        public bool Enabled { get; set; }
    }
}
本文链接:https://www.f2er.com/3166773.html

大家都在问