Ef core - pobieranie nadmiarowej liczby rekordów

0

Mam za zadanie napisać pytanie, które wyciąga z bazy danych userów posiadające permissiony pasujące do permissionNames. Nie mogę wyciągnąć ani adminów, ani master adminów, jako że wyprowadzam dane do listy userów. Problem jednak w tym, że admini/masterzy mogą posiadać więcej ról niż admin, stąd są oni uwzględniani w zapytaniu. Miałby ktoś pomysł, jak zmodyfikować to zapytanie, żeby zwracało tylko tych użytkowników, gdzie żadna z ról nie równa się adminowi/master adminowi?

 return (from user in dbcontext.Users
                    join userRole in dbcontext.UserRoles on user.Id equals userRole.UserId
                    join role in dbcontext.Roles on userRole.RoleId equals role.Id
                    join permission in dbcontext.RolePermissions on role.Id equals permission.RoleId
                    where permissionNames.Any(name => name == permission.Name)
                    && role.Name != Consts.MasterAdmin
                    && role.Name != Consts.Admin
                    select new { user, permission }).GroupBy(grp => grp.user)
                .Where(grp => permissionNames.All(name => grp.Any(record => record.permission.Name == name)))
                .Select(grp => grp.Key);
0

Nie prościej byłoby użyć czegoś na wzór "WHERE [Field] NOT IN ([Query])"?

0

W porządku, tylko jak to zamieścić w moim zapytaniu? Niestety dopiero poznaję składnię EF Core.

1

Rozważałeś zdenormalizowany model bazodanowy, zapis oparty na triggerach albo zmaterializowany widok.? Zachwile się okaże, że dojdą tam jeszcze inne jointy.

0

Finalnie dodałem linijkę z warunkiem na samym wstępie zapytania i działa dobrze. Faktycznie pora postawić na widoki, bo zapytania się coraz bardziej skomplikowane zaczynają robić (coraz więcej jointów :). Co do triggerów > ja tam wolę mieć kontrolę nad aplikacją. Swego czasu często je stosowałem, po czym w pewnym momencie się robił taki bajzel, że lepiej było ich w ogóle nie ruszać. Zdenormalizowany model bazodanowy - pojęcie mi niestety nie znane.

Rozwiązanie:

return (from user in dbcontext.Users.Where(u => u.Roles.All(r => ManagementRoles.All(mr => mr.Id != r.RoleId)))

1 użytkowników online, w tym zalogowanych: 0, gości: 1