2011-11-02 76 views
0

我試圖根據ID列表找到記錄。但是當記錄被返回時,訂單就會丟失。
我需要按照與list中收到的順序相同的順序返回records。我將如何做到這一點?根據ID列表選擇記錄並保留訂單

// 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; 
} 
+0

爲什麼在最後不要調用'records.OrederBy(x => x.record_id)'? –

+0

SQL將無法保留您的訂單。您必須在應用程序中手動排序結果。 –

+0

@Saeed是不是隻是將記錄從最小到最大的id排序,而不是按照它在'list'中收到的順序? – Niklas

回答

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)的一個。

+0

我發現一個更簡單的方法:'records.OrderBy(x => list.IndexOf(x.record_id));' – Niklas

+0

@Niklas是啊,我不知道爲什麼我這麼寫:) –