2011-11-14 140 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