2012-12-18 14 views
5

Przejmuję kontrolę nad kodem struktury encji i zamierzam go zmienić. Zanim to zrobię, chciałbym sprawdzić, czy moje myśli są poprawne i nie brakuje mi ramowego sposobu robienia rzeczy.Refaktoryzacja warstwy danych

Przykład 1 - Podkwerenda vs Dołącz

Tutaj mamy jeden-do-wielu między As i pensjonatów. Oprócz tego, że poniższy kod jest trudny do odczytania, czy jest on również nieefektywny?

from a in dataContext.As 
where ((from b in dataContext.Bs 
     where b.Text.StartsWith(searchText) 
     select b.AId).Distinct()).Contains(a.Id) 
select a 

Czy lepiej byłoby na przykład skorzystać z łączenia i zrobić coś takiego?

from a in dataContext.As 
where a.Bs.Any(b => b.Text.StartsWith(searchText)) 
select a 

Przykład 2 - Jednoznaczne przyłącza vs widoku

Mamy tu jeden-do-wielu między As i B i jeden-do-wielu między B i Cs.

from a in dataContext.As 
join b in dataContext.Bs on b.AId equals a.Id 
join c in dataContext.Cs on c.BId equals b.Id 
where c.SomeValue equals searchValue 
select a 

Czy istnieje dobry powód, by używać jawnych połączeń zamiast nawigować przez model danych? Na przykład:

from a in dataContext.As 
where a.Bs.Any(b => b.Cs.Any(c => c.SomeValue == searchValue) 
select a 

Odpowiedz

0

Czasami jest to niezbędne do korzystania z join-styl i podzapytania, aby uzyskać kontrolę nad niektórymi aspektami zapytaniu SQL LINQ 2. Tak nie jest w tym przypadku. Styl "nawigacji" jest ściśle preferowany. Czasami ma ona nawet zalety związane z wydajnością, ponieważ LINQ do SQL używał bardziej inteligentnych wzorców SQL.

Nie chcę odpowiedzieć tylko "masz rację", więc powiem, że mam duże doświadczenie z LINQ do SQL. Używam go w dwóch większych projektach, w których wydajność jest krytyczna i prawie każda wygenerowana instrukcja SQL jest sprawdzona przeze mnie. Tak więc ta odpowiedź ma pewien autorytet i nie jest tylko przypadkową opinią w Internecie.

+0

Dzięki za poświęcenie czasu na odpowiedź. – Joey

Powiązane problemy