2013-01-18 83 views
2

我有一個消息列表。在每條消息中都有一個響應類型列表。我需要以消息按ID排序的方式提取查詢,響應類型也按ID排序。它們不是通過數據庫中的ID進行排序的。EntityFramework排序子集

messageResponse.Messages = (from m in db.Messages.Include("ResponseType") 
    .SomeMagicSubSortThing("ResponseType.ID") 
    select m).OrderBy(m1 => m1.ID).ToList<Message>(); 

這將導致:

Message ID Col1 Col2 
-- ResponseType ID Col1 Col2 

...像這樣:

1  MessageA MessageB 
-- 1 ResponseTypeC ResponseTypeD 
-- 2 ResponseTypeQ ResponseTypeR 
-- 3 ResponseTypeX ResponseTypeZ 
-- 4 ResponseTypeL ResponseTypeM 

2  MessageE MessageF 
-- 1 ResponseTypeG ResponseTypeH 
-- 2 ResponseTypeI ResponseTypeJ 
-- 3 ResponseTypeB ResponseTypeS 
-- 4 ResponseTypeL ResponseTypeC 

現在,我可以爲了得到消息,但響應類型是什麼爲了數據庫擁有它們。如何對響應類型進行分類?

回答

1

我想你在找什麼是ThenBy():

messageResponse.Messages = (from m in db.Messages.Include("ResponseType") 
.SomeMagicSubSortThing("ResponseType.ID") 
select m).OrderBy(m1 => m1.ID).ThenBy(n=>n.ResponseType.ID).ToList<Message>() 

UPDATE

在你的實體你能簡單地定義一個計算的屬性,如:

class Message { 
    public ICollection<Response> Responses {get; set;} 
    public ICollection<Response> SoretedResponses { 
     get { return this.Responses.OrderBy(n=>n.Response); } 
    } 
} 

或者我仍然錯過了這個問題?

+0

這裏的ResponseType是一個實體集合(不是標準的LINQ子集),因爲我使用的是實體框架。我沒有對ResponseType對象中的屬性直接訪問Linq(我知道的)。我真的希望這是LINQ,但事實並非如此。 – Jerry

+0

用另一個可能的選項更新它 – Matthew

+0

第二種方法是我們試圖實現的方法。由於代碼存在其他問題(而不是您建議的實現),因此我們無法使用它。但是,如果我們一開始就建立了合適的東西,第二個解決方案將是一個很好的方法。 – Jerry

0

EF並沒有這樣做很好,但你有兩種選擇:


1)使用Select子句中的LINQ到實體查詢:

var messages = db.Messages 
    .OrderBy(o => o.ID) 
    .Select(o => new 
    { 
     Message = o, 
     ResponseTypes = o.ResponseTypes.OrderBy(x => x.ID), 
    } 
) 
    .ToList() 
; 

這是唯一的獲取EF以在數據庫服務器上對子屬性進行排序的方式。
你的輸出List將有匿名類型的元素在Select


2)使用LINQ到對象的輸出List<Message>ResponseType集合排序:

List<Message> messages = db.Messages 
    .Include(o => o.ResponseTypes) 
    .OrderBy(o => o.ID) 
    .ToList() 
; 

foreach(var message in messages) 
{ 
    message.ResponseTypes = message.ResponseTypes.OrderBy(x => x.ID).ToList(); 
} 

這得到所有來自數據庫的記錄,然後將它們排序在內存中。
輸出列表將包含類型爲Message的元素,並填充導航屬性。