按行字段降序排序查询

3

我想编写一个EF查询,根据条件进行升序或降序排序。以下是我的伪代码:

      var result= q.OrderByDescending(x => x.StatusId == 3)
                         if( x.StatusId == 3) 
                              then order by x.ReserveDate
                         if( x.StatusId != 3 ) 
                              then order by descending x.LastUpdateDate

我该怎么做呢?

更新

这与被标记为重复问题的q = condition ? q.OrderBy(..) : q.OrderByDescending(..)不同,排序顺序基于行内值而不是查询外部标志。


1
那么,如果StatusID == 3,则显示在顶部,否则在底部。这是你想要的吗? - kgzdev
@ikram-turgunbaev 没错! - ahmad-r
在查询中使用基于条件的追加,例如 - var result = //..... ; if(condition) { result = result.OrderBy } ... else { result = result.OrderByDescending..} ....//这只是为了给您一个想法 - Incredible
1
你可以使用两个查询并联接结果来完成这个操作。类似于这样的伪SQL查询语句:Select * from myTable Where StatusId == 3 OrderBy ReverseDate Union Select * from my Table Where StatusId != 3 OrderBy LastUpdateDate Desc 我相信在LINQ中,Concat方法等同于sql查询中的Union。 - BoeseB
1
请重新打开,标记为重复的问题具有不同的条件和不同的答案。参考的重复问题是基于常量标志的条件,而这个问题是基于行的值。 - Akash Kava
1
@AkashKava 完成了。 (并且表明了通过清晰地指定问题所做的差异。) - Richard
2个回答

1

您可以在 OrderBy 中提供复杂的表达式...

// you might have to give bounding start,end for
// for this query to work correctly...

var end = DateTime.Now;
var start = end.AddYears(-100);

var result = q.OrderBy( 
               x => x.StatusId == 3 ?  

               // this will sort by in ascending order 
               DbFunctions.DiffDays(x.ReserveDate, start) :

               // this will sort in descending order
               DbFunctions.DiffDays(end, x.LastUpdateDate) );

生成的 SQL 将为:
SELECT 
    ...
    ...
    FROM ( SELECT CASE 
        WHEN ([Extent2].[StatusId ] = 3) 
            THEN DATEDIFF (day, @p__linq__0, [Extent1].[ReserveDate]) 
        ELSE 
            DATEDIFF (day, [Extent1].[LastUpdateDate], @p__linq__1) 
        END AS [C1] 
        FROM  [dbo].[Table] AS [Extent1]
    )  AS [Project1]
    ORDER BY [Project1].[C1]

0

正如BoessB的评论所说,最简单的方法是使用两个连接查询:

var q1 = from x in source
         where x.StatusId == 3
         order by x.ReserveDate;
var q2 = from x in source
         where x.StatusId != 3
         order by x.LastUpdateDate descending;

var results  = await q1.Concat(q2).ToListAsync();

如果您可以从ReserveDateLastUpdateDate创建一个派生字段(let子句有所帮助),以正确的方式进行排序,那么可能可以在单个表达式中完成。但我建议拆分查询会更清晰。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接