2011-11-14 54 views
1

我有一個查詢,我的發佈日期獲得冠軍回來,以便它們的負載:實體框架 - 合併排序2列

 model.NewCollections = db.Collections 
           .Where(p => p.ReleaseDate < DateTime.Now) 
           .OrderByDescending(o => o.ReleaseDate) 
           .Take(5); 

現在我已經添加了另一列到我的數據庫,所以我現在有一個平裝發佈日期和精裝版發佈日期(這使用原始發佈日期)。

我想要一個查詢,將讓我所有的精裝本和平裝本,其中的發佈日期是今天之後,我假設我可以這樣做:

 model.NewCollections = db.Collections 
           .Where(p => p.ReleaseDate < DateTime.Now || p.PBReleaseDate < DateTime.Now) 
           .OrderByDescending(o => o.ReleaseDate) 
           .Take(5); 

但如何訂購這些讓他們按照降序排列順序回到右邊?

即如果查詢帶回下面的列表(想象今天的日期是11月14日):

Title 1: HB: 13/11/11 PB: 31/12/11 
Title 2: HB: 31/12/11 PB: 31/12/11 
Title 3: HB: 11/11/11 PB: 31/12/11 
Title 4: HB: 31/12/11 PB: 31/12/11 
Title 5: HB: 31/12/11 PB: 10/11/11 
Title 6: HB: 31/12/11 PB: 12/11/11 
Title 7: HB: 31/12/11 PB: 31/12/11 
Title 8: HB: 31/12/11 PB: 31/12/11 
Title 9: HB: 31/12/11 PB: 31/12/11 
Title 10: HB: 31/12/11 PB: 09/11/11 

回來與標題的順序如下:1,6,3,5,10

在此先感謝

回答

1

您需要選擇到您計算組合的釋數據臨時對象:

model.NewCollections = db.Collections 
    .Where(p => p.ReleaseDate < DateTime.Now || p.PBReleaseDate < DateTime.Now) 
    .Select(c => new { c.Title, Date = c.PBReleaseDate < c.ReleaseDate ? c.PBReleaseDate : c.ReleaseDate }) 
    .OrderByDescending(c => c.Date) 
    .Take(5).ToList(); 

從這個LINQ查詢EF將生成正確的CASE語句下面的SQL查詢:

SELECT TOP (5) 
[Project1].[C1] AS [C1], 
[Project1].[Title] AS [Title], 
[Project1].[C2] AS [C2] 
FROM (SELECT 
    [Extent1].[Title] AS [Title], 
    1 AS [C1], 
    CASE WHEN ([Extent1].[PBReleaseDate] < [Extent1].[ReleaseDate]) THEN [Extent1].[PBReleaseDate] ELSE [Extent1].[ReleaseDate] END AS [C2] 
    FROM [dbo].[Collections] AS [Extent1] 
    WHERE ([Extent1].[ReleaseDate] < (SysDateTime())) OR ([Extent1].[PBReleaseDate] < (SysDateTime())) 
) AS [Project1] 
ORDER BY [Project1].[C2] DESC 

這是對您的測試數據產生預期的結果:

[0]: { Title = "1", Date = {11/13/2011 12:00:00 AM} } 
[1]: { Title = "6", Date = {11/12/2011 12:00:00 AM} } 
[2]: { Title = "3", Date = {11/11/2011 12:00:00 AM} } 
[3]: { Title = "5", Date = {11/10/2011 12:00:00 AM} } 
[4]: { Title = "10", Date = {11/9/2011 12:00:00 AM} } 
+0

@Sniffer你需要更多的幫助解決這個問題? :-) – nemesv