Ef core - pobieranie nadmiarowej liczby rekordów

Odpowiedz Nowy wątek
2018-10-26 16:42
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);

Pozostało 580 znaków

2018-10-26 16:57
0

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

Pozostało 580 znaków

2018-10-26 17:02
0

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

A takie buty. - ._. 2018-10-26 17:16

Pozostało 580 znaków

2018-10-26 17:14
._.
1

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

jointy? Ktoś tu sobie chyba humor poprawia. :P - somekind 2018-10-27 00:54
Jointy..? To nieekologiczne. Planetarianini palą z bonga. - ._. 2018-10-27 03:35

Pozostało 580 znaków

2018-10-28 18:05
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)))

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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