EF Core pobieranie danych na podstawie podanej listy ID

0

Cześć,
chciałem zrobić sobie generyczną metodę do pobierania danych:

public async virtual Task<List<TValue>> GetAsync<TKey, TValue>(ICollection<TKey> id)
            where TKey : struct
            where TValue : class, IReferenceType<TKey, TValue>
        {
            if (id == null || id.Count == 0)
            {
                return new List<TValue>();
            }

            List<TValue> items = await _dataContext.Set<TValue>().Where(w => id.Contains(w.GetReferenceKey())).ToListAsync();

            return items;
        }

Ale jak używam Contains to dostaje:

The LINQ expression 'DbSet<Operator>()
.Where(o => __id_0.Contains(o.GetReferenceKey()))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

zwykłego == też nie mogę użyć bo otrzymuje:

Operator '==' cannot be applied to operands of type 'TKey' and 'TKey'

Jak mogę rozwiązać ten problem?
Obstawiam że przez to ze obiekt implementuje IReferenceType który zwraca PK, to przy użyciu GetReferenceKey() EF nie wie na którą kolumnę ma nałożyć warunek.

0

Mi to raczej wygląda że Contains nie może być wykonany po stronie bazy. Od ef core 3 musisz jawnie podać co się na wykonać po stronie clienta. W komunikacie błędu masz podane opcje jakie możesz zastosować.

0
_dataContext.Operators.Where(w => id.Contains(w.IdOperator)).ToListAsync();

W ten sposób działa, ładnie tworzy zapytanie z = lub in()
Sposób podany w komunikacje jest słaby bo pobiera całą tabelkę.

0

No właśnie w tamten sposób z pierwszego posta pobierasz całą tabele, a ten błąd cie informuje że jeśli naprawdę chcesz to zrobić to musisz podać to jawnie.

0

Da się jakoś to generycznie ogarnąć? w DB mam klucze zapisane jako int i long.

2

Obawiam się, że aby zrobić to generycznie w tym biedaormie, to trzeba zbudować odpowiednie Expression porównujące ID i przekazać je do Where.

0

Mógłbyś podesłać jakiś tutorial albo coś czym bym się mógł wesprzeć?

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