Выбор записей на основе списка идентификаторов и сохранение порядка

#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 да, я не знаю, почему я так написал 🙂