Entity Framework: фильтр на основе дочернего объекта последнего уровня - PullRequest
1 голос
/ 04 ноября 2019

У меня есть следующие классы сущностей, которые кратко представляют отношения.

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

Я хочу получить пользователей, у которых флаг Enabled установлен в true, из таблицы UserPrivilege. Я не могу получить запрос 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 не является напрямую сопоставленным свойством или свойством Navigation, ответ Винса дает мне следующую ошибку

System.NotSupportedException: «Указанный член типа« NetworkRoles »не поддерживается в LINQ to Entities. Поддерживаются только инициализаторы, элементы сущностей и свойства навигации сущностей. '

1 Ответ

1 голос
/ 04 ноября 2019

Попробуйте это

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