EF - zapytanie zagnieżdżone

0

Mam takie zapytanie SQLowe:

SELECT * FROM Accounts WHERE IdAccount = (SELECT IdAccount FROM Assistances WHERE IdUser=6);

Ogarnąłem to w ten sposób:

var assists = _context.Assistances.Where(c => c.IdUser == user.IdUser).ToList();
                var query = _context.Accounts.Where(x => x.IsDeleted != 1);

                foreach(var assist in assists)
                {
                    query = query.Where(z => z.IdAccount == assist.IdAccount);
                }

Rozwiązanie trochę mało eleganckie - jestem pewien, że da się to ogarnąć jednym wyrażeniem LINQowym, poza tym nie do końca działa, bo kolejne predykaty WHERE dodawane do zapytania budują wyrażenie typu AND a nie OR.

Mógłbym prosić o wsparcie w tym temacie?

Z góry dziękuję

4
SELECT * FROM Accounts WHERE IdAccount = (SELECT IdAccount FROM Assistances WHERE IdUser=6);

a tu nie ma być IN?

a zatem:

var query = _context.Accounts.Where(x => x.IsDeleted != 1 && assists.Contains(x.IdAccount));

Note: IIRC to assists musi być materialized, tak jakbyś przerabiał i miał problemy.

3

Tak jak napisał @WeiXiao. Ja bym jeszcze wywalił x=>x.isDeleted z zapytania i dodał to do konfiguracji EF.
https://docs.microsoft.com/pl-pl/ef/core/querying/filters
Żeby za każdym razem nie musieć odfiltrować usuniętych rekordów jeśli to jest soft delete.

0

@WeiXiao:

      var assists = _context.Assistances.Where(c => c.IdUser == user.IdUser).ToList();
      var query = _context.Accounts.Where(x => x.IsDeleted != 1 && assists.Contains(x.IdAccount));

Cannot convert from 'int' to .Models.Assistance - nie kompiluje się. Zresztą tak już próbowałem wcześniej ;)

Sorki za głupie pytania, ale ten ORM to kompletna nowość dla mnie póki co.

0

@kal800:

var assistsIds = _context.Assistances.Where(c => c.IdUser == user.IdUser).Select(x => x.IdAccount).ToList();
0

Dzięki bardzo, wszystko działa jak należy. 👍🏻

Powoli tego EFa zaczynam łapać. Ostatnio kodowałem 20 lat temu po studiach i sporo się zmieniło przez ten czas ;)

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