2011-08-08 11 views
14

Korzystanie z VB.net i następujące oświadczenie LINQ. Podejrzewam, że "Zamówienie według" nie działa z Concat(). Chcę wyświetlić bieżący element, który ma użytkownik, a następnie wyświetlić więcej dostępnych elementów w kolejnej kolejności. Najpierw wybieram bieżący element z bazy danych, a następnie wybieram kolejne dostępne pozycje w kolejności. LINQ ignoruje kolejność według instrukcji i sortowania według PK (która jest itemID) Sprawdziłem listę natychmiast po wykonaniu instrukcji. Kiedy dzielę oświadczenie i robię je oddzielnie, działają zgodnie z przewidywaniami. Wszelkie pomysły, sugestie lub komentarze. Dzięki, PMZamówienie przez nie działa z Concat() w LINQ

(From items In myDatabase.ItemAssignments _ 
Where items.BuildingID = buildingID _ 
And items.ResidentID = ResidentID _ 
Select items).Concat(From moreitems In myDatabase.ItemAssignments _ 
         Where moreitems.occupied = 0 _ 
         And moreitems.BuildingID = buildingID _ 
         Order by moreitems.Floor, moreitems.ItemNumber _ 
         Select moreitems) 

Odpowiedz

14

Concat rzeczywiście ignorować klauzuli ORDER BY, jeśli chodzi o LINQ to SQL. Można to sprawdzić na podstawie wygenerowanego kodu SQL, jeśli używasz LINQPad lub konfigurujesz DataContext.Log property.

Jednym ze sposobów radzenia sobie z tym jest wprowadzenie wartości fikcyjnej za pomocą anonimowego typu, aby pomóc w zamówieniu. Rozdzielam poniższe zapytania dla jasności, chociaż to samo podejście jest możliwe przy użyciu składni zapytania, od której zaczynałeś, aż do momentu, kiedy będziesz musiał podać kolejność.

Dim firstQuery = From items In myDatabase.ItemAssignments _ 
       Where items.BuildingID = buildingID _ 
       And items.ResidentID = ResidentID _ 
       Select New With { .Row = items, .Order = 1 } 
Dim secondQuery = From moreitems In myDatabase.ItemAssignments _ 
        Where moreitems.occupied = 0 _ 
        And moreitems.BuildingID = buildingID _ 
        Select New With { .Row = moreitems, .Order = 2 } 

Dim query = firstQuery.Concat(secondQuery) _ 
         .OrderBy(Function(o) o.Order) _ 
         .ThenBy(Function(o) o.Row.Floor) _ 
         .ThenBy(Function(o) o.Row.ItemNumber) _ 
         .Select(Function(o) o.Row) 

Inną opcją jest mniej pożądane, aby wywołać AsEnumerable method na jednym z zapytaniami, które będzie ciągnąć wyników z bazy danych. W zależności od liczby pozycji i konieczności dalszego filtrowania może to mieć negatywny wpływ na wydajność.

Aby to zmienić to podejście wykorzystać pierwszą część oryginalnego zapytania do użycia:

From items In myDatabase.ItemAssignments.AsEnumerable() ... 

zamawiania na drugiej części będzie wówczas działać zgodnie z przeznaczeniem, a wygenerowany SQL będzie odzwierciedlać tyle.

Powiązane problemy