2013-03-15 3 views
1

Я выполняю запрос LINQ, где я выбираю видеоинформацию из таблицы Видео. Запрос выбирает только те видео, идентификаторы которых присутствуют в следующем списке:Контроль порядка запросов LINQ на основе другого списка целых чисел

List<int> results; //Has some values 
var query = from l in dataContext.Videos 
       where results.Contains(l.ID) 
       select l; 

Теперь, как сделать заказ пунктов (Видео) Информация в запросе такие, что их идентификаторы следуют в том же порядке, что и список результатов?

Я могу сделать это, как:

List<int> results; //Has some values 
var query = from k in results 
      from l in dataContext.Videos 
      where k==l.ID 
      select l; 

Но это медленно, мне нужно что-то быстрее.

ответ

6

Используйте join, это намного быстрее

var orderedByIDList = from k in results 
join l in dataContext.Videos 
on k equals l.Id 
select l; 

Addon/Edit благодаря @MarcinJuraszek и @Phil комментарии, спасибо, ребята.

В основном захватить ваши данные первого, потом вроде так вот что я получил:

var myList = (from l in dataContext.Videos 
where results.Contains(l.ID) 
select l).ToList(); //grab data and resolve to list or array 

var orderedByIDList = from k in results 
join l in myList 
on k equals l.Id 
select l; //result type IEnumerable<Video> 
+0

Не думаю, что вы можете присоединиться к DataContext стол с местной коллекции – MarcinJuraszek

+0

Я просто попытался его, и он работает в Entity Framework, а не в Linq для SQL. Однако, как представляется, он выбирает всю таблицу и соединяется локально, что не так хорошо. – Phil

+0

Вам нужно «на k равно l.Id». Это не работает наоборот. – Phil

1

Вот моя альтернативная попытка (вероятно, не так быстро, как присоединиться), который извлекает минимальный набор строк, а затем приказывает данные локально.

var results = new List<int>{ 9, 2, 3, 6, 8 }; 

// record the original order 
var results2 = results.Select ((r, index) => new {r, index}); 

// get results and convert to list 
var videos = dataContext.Videos.Where(v => results.Contains(v.Id)).ToList(); 

// order according to results order 
var ordered = videos.Select (v => 
    new {v, results2.Single (r => r.r == v.Id).index}) 
    .OrderBy (v => v.index).Select (v => v.v) 
Смежные вопросы