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).
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