2013-03-15 61 views
1

我正在做一个LINQ查询,我从表视频中选择视频信息。该查询只选择其ID出现在下面的列表中这些视频:基于其他整数列表控制LINQ查询顺序

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

现在我该怎样才能在查询这样的它们的ID遵循相同的顺序列出结果中的项目(视频的相关信息)?

我能够做到这一点是:

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; 

附加组件/由于@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

不要以为你可以加入当地收集 – MarcinJuraszek 2013-03-15 20:22:46

+0

DataContext的表我只是尝试它和它的作品在实体框架,而不是在LINQ to SQL。然而,它似乎选择整个表并加入本地,这不是很好。 – Phil 2013-03-15 20:27:17

+0

你需要'在k等于l.Id'。相反,它不起作用。 – Phil 2013-03-15 20:43:26

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)