Entity Framework 5+ ma na celu wstępne skompilowanie wszystkich zapytań. Jednak dla zapytań takich jakEntity Framework: Precompiled Query dla Enumerable.Contains
List<Guid> ids;
var entities = context.MyEntities.Where(x => ids.Contains(x.Id)).ToArray();
Entity Framework nie może precompile zapytania, w zależności od stopnia skomplikowania całego zapytania, parsowanie drzewa wyraz SQL mogą spożywać kilka sekund. Czy ktoś znalazł obejście, aby mimo to uzyskać prekompilowane zapytanie? Naprawdę nie rozumiem, dlaczego byłoby to takie trudne; Oczywiście trudno jest zrobić z paramters, ponieważ liczba elementów może się różnić, ale to byłoby na tyle dobrze, że SQL jak
SELECT a, b, c from MyEntities
WHERE c in __PLACEHOLDER__
a następnie zastąpić zastępczy z rzeczywistych elementów listy. Oczywiście nie jest tak przyjemny, jak przekazywanie parametrów, ale byłby o wiele lepszy niż czekanie na sekundy do analizowania całego drzewa wyrażeń w kółko.
Listy nie mogą być używane jako parametry, więc robi to, co sugerujesz, to jest, że konstruuje nowe zapytanie, ponieważ twoja lista może zawierać różne elementy za każdym razem, gdy go wywołasz. W rzeczywistości jest to ograniczenie SQL. –
Niezupełnie; jak już wspomniano, za każdym razem rozpoczyna parsowanie drzewa ekspresji od zera.mamy kwerendę z kilkoma złączeniami, która trwa 5 sekund do przeanalizowania (z kilkoma ms na serwerze sql), dlatego szukam obejścia. – Roland
@rolandJak duża jest ta lista? Co więcej, czy będziesz już używać? Problem może zależeć od tego, jak długo każdy wpis jest ....... ile on musi porównać. Miałem podobny problem z .StartsWith, dopóki nie użyłem StringComparison.Ordinal tam, który przyspieszył znacznie (w porównaniu do .Contains). Problem może polegać tylko na tym, że musi on iterować przez zbyt duże struny (na dużą skalę wymaga to czasu). Jeśli możesz go zmienić na startwith i porządkowy, powinien on znacznie się rozluźnić (ale zależy od twojego dokładnego przypadku użycia). – Thomas