#linq #linq-to-sql
#linq #linq-to-sql
Вопрос:
Я пытаюсь найти записи на основе списка идентификаторов. Но когда записи возвращаются, порядок теряется.
Мне нужно вернуть records
в том же порядке, в каком он был получен в list
. Как мне это сделать?
// Select Records from list of id's
public IQueryable<Record> GetRecords(List<int> list)
{
/*
* Linq to SQL has a limit on 2100
*/
var records = Enumerable.Empty<Record>().AsQueryable<Records>();
var limit = 2000;
var result = list.Select((value, index) => new { Index = index, Value = value })
.GroupBy(x => x.Index / limit)
.Select(g => g.Select(x => x.Value).ToList())
.ToList();
foreach (var r in result)
{
var row = r;
records = records.Union(db.Records.Where(a => row.Contains(a.record_id)));
}
return records;
}
Комментарии:
1. Почему не вызывается
records.OrederBy(x=>x.record_id)
в конце?2. SQL не сможет сохранить ваш порядок. Вы должны отсортировать результат вручную в своем приложении.
3. @Saeed Разве это не просто упорядочило бы записи от наименьшего до наибольшего идентификатора, а не в том порядке, в котором он был получен в
list
?4. каков был порядок сортировки списка? это было произвольно? или есть какое-то правило?
5. Да, это полностью зависит от пользователя, как сортировать список до его получения.
Ответ №1:
Простой способ заключается в следующем:
records.Select(x=>new {index = list.IndexOf(x.record_id), record = x})
.OrderBy(x=>x.index).Select(x=>x.record);
Это O (n ^ 2), но может быть и O (n log n) один.
Комментарии:
1. Я нашел еще более простой способ:
records.OrderBy(x => list.IndexOf(x.record_id));
2. @Niklas да, я не знаю, почему я так написал 🙂