jak napisać zapytanie w linq lub lambda aby pobrać 10 najnowzych rekordów i jednocześnie wszystkie kóre pewną kolumne typu bool mają watrości przypisane na fales, do tych 10 wliczają się też te z wartością we wspomianym polu na fales więc wynik zapytania może być np: 12 rekordów z czego 10 jest najnowszych i powiedzmy 5 z wartością fales w określonym polu czyli 3 mają pole o wartości fales i jednocześnie są w dziecięciu najnowszych
Pobierz dziesięć najnowszych dorzuć do tego te co mają booleana ustawionego jak chcesz z wykluczeniem tych d dziesięciu najnowszych.
Coś takiego (pisane bez IDE):
var tenNewest = list.OrderByDescending(o => o.Date).Take(10);
var falsyCount = tenNewest.Count(o => !o.Prop);
var result = tenNewest.Union(list.Skip(10).Where(o => !o.Prop).Take(10 - falsyCount));
Wypróbuj - błędy niewykluczone :P
@Sarrus Chyba zrozumiałam inaczej. Ty pod koniec bierzesz tyle elementów spoza pierwszej dziesiątki, żeby w wyniku było 10 "fałszywych". Według mnie chodziło o to, żeby spoza pierwszej dziesiątki wziąć wszystkie fałszywe, więc...
var tenNewest = list.OrderByDescending(o => o.Date).Take(10);
var result = tenNewest.Union(list.Skip(10).Where(o => !o.Prop));
albo tak:
var orderedByDate = list.OrderByDescending(o => o.Date);
var result = orderedByDate.Where((item, index) => !item.BoolColumn || index < 10);
wystarczy:
var top = data
.OrderBy(x => x.Id)
.Take(10)
.Union(data.Where(x => !x.Prop))
.ToList();
union nie doda dwa razy tego samego elementu. Jeżeli chcemy zmienić działanie union to wystarczy zaimplementować i podać do Union interfejs IEqualityComparer
lub zaimplementować wewnątrz klasy metodę Equals
Zwracam uwagę, że (przy odpowiednio dużej kolekcji) połączenie Order i Take by wziąć n skrajnych elementów będzie dużo wolniejsze niż mogłoby być, bo niepotrzebnie sortuje się całą kolekcję.
Ale jak niepotrzebnie, jeśli trzeba wziąć elementy najjakieś?