ПРЕДЫДУЩАЯ: В этом вопросе кто-то сказал мне, как использовать CompareTo для возврата фамилий в пределах определенного диапазона, упорядоченного в алфавитном порядке с помощью LINQ to Objects.
Остальная часть моего вопроса, который, кажется, пропустил первоначальный вопрос о безумном кормлении, фактически возникла после того, как я проверил это решение. В предыдущем примере у меня был список имен:
Adams
Bentham
Bickford
Gillies
Kelly
Moore
Peters
Rutherford
Smith
Taylor
Williams
И я хотел иметь возможность запросить их, например, для всех имен между Джиллис и Мур и получить:
Gillies
Kelly
Moore
Это все хорошо, если вы хотите, чтобы каждое отдельное имя в промежутке между стойками ворот возвращалось, несмотря ни на что. Проблема возникает, когда у вас огромное количество фамилий, и вы хотите, чтобы максимум четыре из имен между Джиллис и Тейлор возвращались в алфавитном порядке, например.
Итак, желаемый результат:
Gillies
Kelly
Moore
Peters
Однако, только возвращение четырех результатов между Джиллис и Тейлором может вернуть Келли, Питера, Смита и Тейлора или Джиллис, Мура, Резерфорда и Смита. По сути, запрос берет ваше слово и просто выбирает любую старую четверку между стойками ворот.
Итак, как я могу получить 4 лучших результата в алфавитном порядке. Конечно, я мог бы написать второй запрос и вернуть подмножество, а затем выбрать из него ... но не должно ли быть способ интегрировать это поведение в исходный запрос?
Я пробовал несколько вещей с OrderBy, и пока они просто не работают. Так что все кончено, ребята.
РЕДАКТИРОВАТЬ: для тех двоих из вас, кто предложил использовать "взять", я уже использую принять. Это не «принимает» по порядку, даже если вы используете OrderBy или, по крайней мере, не в моем запросе. Вот оно:
var allIDs = (from cust in dc.orders
join item in dc.order_items on cust.orderid equals item.orderid
join del in dc.deliveries on cust.deliveryid equals del.deliveryid
join dt in dc.deliverytypes on del.deliverytype equals dt.deliverytypeid
where eventcode == item.itemcode
&& dt.description == "Secure Post"
&& (cust.status == "OK" || cust.status == "PB")
&& cust.surname.CompareTo(surfrom ?? " ") >= 0
&& cust.surname.CompareTo(surto ?? "zzz") <= 0
&& (cust.trackingcode == null ? false : (bool)cust.trackingcode)==false
orderby cust.surname, cust.initials, cust.ordercode
select cust.orderid).Distinct().Take(ordermax);
Это просто возвращает четыре имени между именами, которые вы выбрали, а не конкретные четыре имени.