Projektuję wyniki LINQ do SQL na silnie typowane klasy: Parent i Child. Różnica wydajności pomiędzy tymi dwoma zapytaniami jest duża:Odwzorowane zapytanie LINQ typu jeden-do-wielu wykonuje się wielokrotnie
Powolne Query - zalogowaniu z DataContext pokazuje, że oddzielne wywołanie db jest dokonywana dla każdego rodzica
var q = from p in parenttable
select new Parent()
{
id = p.id,
Children = (from c in childtable
where c.parentid = p.id
select c).ToList()
}
return q.ToList() //SLOW
Szybka kwerenda - zalogowaniu z pokazów DataContext jedno trafienie db kwerendy, która zwraca wszystkie wymagane dane
var q = from p in parenttable
select new Parent()
{
id = p.id,
Children = from c in childtable
where c.parentid = p.id
select c
}
return q.ToList() //FAST
Chcę zmusić LINQ użyć stylu pojedynczych zapytań drugiego przykładu, ale zapełnić klasy Parent ze swoimi dziećmi obiektów bezpośrednio. w przeciwnym razie właściwość dla dzieci to IQuerierable<Child>
, która musi zostać sprawdzona w celu odsłonięcia obiektu podrzędnego.
Odniesione pytania nie odnoszą się do mojej sytuacji. korzystanie z db.LoadOptions nie działa. być może wymaga to, aby typ był zarejestrowany w DataContext.
DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Parent>(p => p.Children);
db.LoadOptions = options;
Uwaga: Rodzic i dziecko są typy proste, nie Table<TEntity>
typów. i nie ma relacji kontekstowej między rodzicem a dzieckiem. podzapytania są ad-hoc.
Sedno problemu: w drugim przykładzie LINQ implementuję instrukcje IQueriable
i nie wywołuję funkcji ToList()
iz jakiegoś powodu LINQ wie, jak wygenerować jedno zapytanie, które może pobrać wszystkie wymagane dane. W jaki sposób zapełnić moją projekcję ad-hoc rzeczywistymi danymi, jak ma to miejsce w pierwszym zapytaniu? Ponadto, jeśli ktokolwiek mógłby mi pomóc lepiej - wyrażenie mojego pytania, byłbym wdzięczny.
Jak "dziecko" może być "prostym typem"? Powinien to być typ odwzorowany. I jest "rodzicielskie" a "Tabela" lub wynik poprzedniego zapytania linq? Niektóre instrukcje linq mogą spowodować, że L2S przełączy się z łączenia na N + 1. –
Zduplikowane markery: czy znasz różnicę między strukturą encji a linq do sql? –
@GertArnold Podczas gdy część LINQ EF/L2S często sprawia, że podobne pytania funkcjonalnie duplikują, w * tym * przypadku uważam, że jesteś całkowicie poprawny; nie są duplikatami. Ponowne otwieranie. –