2011-05-04 40 views
6

我有一個列表,指定我的數據庫中一些對象的ID。我想從一個表中得到一組對象,它們都有這些ID並保持它們的順序,並且我希望它作爲一個針對數據庫的查詢執行(不是'N'查詢)。實體框架查詢 - 按特定順序獲取對象

例如,我有一個ID列表{5,3,6,9},並且我想要返回帶有這些ID的Customer對象列表,並按順序保留它們{Customer(5,'Bob' ),客戶(3,'JimBo'),客戶(6,'Joe'),客戶(9,'Jack')}。

數據量足夠小,我不介意在數據庫查詢後重新排序數據量。我可以在大約15行乾淨的代碼中完成所有這些工作(包括手動重新排序),但是我覺得應該有一行或兩行LINQ對EF的查詢,應該很容易做到這一點。

回答

3

我不認爲整個事情可以在一個查詢中完成,但它很容易在兩個查詢中完成。一個在DB上,另一個在內存中。

首先查詢將只選擇客戶指定ID:

var customers = (from c in context.Customers 
       where itemIds.Contains(c.Id) 
       select c).AsEnumerable(); 

其次會根據您的列表命令他們:

var customers = from id in itemIds 
       join c in customers 
       on id equals c.Id 
       select c; 

var customersList = customers.ToList(); 
+0

謝謝。事實證明,AsEnumerable沒有必要(我用SQL Profiler進行了檢查),儘管我也認爲它會是。我不得不說...我的spidey感覺在使用Join時依賴於維護排序的順序。我想知道這是否是文檔中Join的一個聲明屬性(如果不是這樣,它可能會在.NET的某些未來版本中發生更改,例如出於性能原因)。 – pbarranis 2011-05-04 15:33:07

3

我相信在獲得結果後您需要執行您的訂購。我可能會這樣解決它。

var efQuery = /* your query here */.AsEnumerable(); // force evaluation 
var orderedResult = from id in idList // { 5, 3, 6, 9 } 
        join item in efQuery 
        on id equals item.Id 
        select item; 

在內存中加入ID來查詢結果列表中的將保留編號的順序。

編輯:從評論

我的蜘蛛俠在用加入 依靠維持整理 爲了檢測刺痛。我想知道是否這是一個說明 加入文件的屬性(如果 不是它可能會改變一些未來的 版本的.NET,如 性能的原因)。

我點你http://msdn.microsoft.com/en-us/library/bb534675.aspx,該備註部分

加入保留外的 元素的順序,併爲每個 這些元素,的 匹配元素的順序內。

+0

感謝。事實證明,AsEnumerable沒有必要(我用SQL Profiler進行了檢查),儘管我也認爲它會是。我不得不說...我的spidey感覺在使用Join時依賴於維護排序的順序。我想知道這是否是文檔中Join的一個聲明屬性(如果不是這樣,它可能會在.NET的某些未來版本中發生更改,例如出於性能原因)。 – pbarranis 2011-05-04 15:34:29

+0

@pbarranis,休息簡單。我更新了答案以解決訂購文檔。 – 2011-05-04 15:40:31

0

顯然你可以得到一個對象列表,其中ID列表包含了被搜索的ID很容易的對象。至於orderby,根據單個查詢中的ID列表,我無法想到這樣做。但是,如果您有指定原始ID是如何有序的(如果不是隨機的)的一個合乎邏輯的方式,那麼你可以創建一個平等的比較器功能,如圖here

-1
void Main() 
{ 
    List<Data> data = new List<Data>(); 
    data.Add(new Data{Id =1, Name = "ABC1"}); 
    data.Add(new Data{Id =2, Name = "ABC2"}); 
    data.Add(new Data{Id =3, Name = "ABC3"}); 
    data.Add(new Data{Id =4, Name = "ABC4"}); 
    data.Add(new Data{Id =5, Name = "ABC5"}); 

    var result = from d in data 
       let ids = new List<int>{3,4,5} 
       where ids.Any(i=> i == d.Id) 
       select d; 
    result.Dump();    
} 

// Define other methods and classes here 
class Data 
{ 
    public int Id{get;set;} 
    public string Name{get;set;} 
} 

的ID可能是另一個查詢得到的ID從別的地方,但按照你的意願命令它們。請注意,這是Linqpad代碼,因此.Dump()方法。

+0

-1。不是關於訂購,而是EF兼容。 – Euphoric 2011-05-04 14:25:19

+0

不知道爲什麼你會這樣說,你可以讓你喜歡的訂單獲得訂單,並加入到訂單中以獲取客戶。這將是一個查詢。額外的代碼用於測試。 – 2011-05-04 14:29:18