2013-06-03 15 views
5

Próbuję utworzyć metodę przy użyciu LINQ, która pobiera X ilość produktów z DB, więc używam do tego metody .TAKE.Czy istnieje znak wieloznaczny dla metody .Take w LINQ?

Chodzi o to, że w sytuacjach, w których potrzebuję wziąć wszystkie produkty, czy jest tam symbol wieloznaczny, który mogę podać .TAKE lub jakąś inną metodę, która przyniosłaby mi wszystkie produkty w DB?

Co się stanie, jeśli zrobię .TAKE (50) i jest tylko 10 produktów w DB? Mój kod wygląda mniej więcej tak:

var ratingsToPick = context.RatingAndProducts 
    .ToList() 
    .OrderByDescending(c => c.WeightedRating) 
    .Take(pAmmount); 
+4

Twój przykład faktycznie pobiera wszystkie wartości z db, niezależnie od ujęcia. Przenieś swoją ToList() do momentu wykonania ujęcia. – pingoo

Odpowiedz

6

Można oddzielić ją do osobnego połączenia opartego na flagę:

IEnumerable<RatingAndProducts> ratingsToPick = context.RatingAndProducts 
    .OrderByDescending(c => c.WeightedRating); 

if (!takeAll) 
    ratingsToPick = ratingsToPick.Take(pAmmount); 

var results = ratingsToPick.ToList(); 

Jeśli nie obejmują Take, to będzie po prostu wziąć wszystko.

Zauważ, że może trzeba wpisać pierwotne zapytanie jako IEnumerable<MyType> jak OrderByDescending zwraca IOrderedEnumerable i nie będzie ponownie przypisać na podstawie zaproszenia Take. (Lub po prostu można to obejść jako właściwe na podstawie rzeczywistego kodu)

Ponadto, jak @ Rene147 wskazał, należy przenieść swój ToList do końca inaczej będzie pobierać wszystkie pozycji z bazy danych za każdym razem i OrderByDescending i i Take są wtedy faktycznie działające na List<> obiektów w pamięci , a nie wykonujących go jako zapytanie do bazy danych, które, jak przypuszczam, jest niezamierzone.


Jeśli chodzi o Twoje drugie pytanie, jeśli wykonać Take(50) ale tylko 10 wpisy są dostępne. To może zależeć od dostawcy bazy danych, ale w przypadku my, są one na tyle sprytne, że nie rzucają wyjątków i po prostu podają liczbę dostępnych elementów. (Proponuję przeprowadzić szybki test, aby upewnić się, że jest to określone).

+0

Chciałbym sprawdzić wartość pAmmount, coś w stylu: 'if (pAmmount == -1)'. wtedy możesz generować własne symbole wieloznaczne ("-1" w moim przykładzie). –

+0

@ScottChamberlain To może być wiarygodne; Nie wiem, jak MaG3Stican określa, kiedy ma zastosowanie "wieloznacznik". A "-1" to trochę magiczna liczba, więc nie chciałem przyjąć warunku. –

+2

Mój linq2SQL to poziom nowicjusza, robię tylko Linq2Objects, ale czy 'ToList()' sprawia, że ​​jest to zapytanie Linq2Objects i nie jest już zależne od dostawcy bazy danych? EDYCJA: BAH, to już dwa razy, proszę cię o coś i natychmiast edytujesz swoje pytanie, wyjaśniając je, gdy uderzę "Dodaj komentarz". –

2

Twoje obecne rozwiązanie zawsze pobiera z bazy danych produkty wszystkie. Ponieważ dzwonisz pod numer ToList(). Po załadowaniu wszystkich produktów z bazy danych bierzesz pierwsze N ​​w pamięci. Aby warunkowo wczytać pierwsze produkty N, musisz zbudować zapytanie

Powiązane problemy