【问题标题】:Condition in lambda expression order bylambda 表达式中的条件 order by
【发布时间】:2013-03-04 13:56:56
【问题描述】:

我有 2 个 Lists 返回相同的 Item 。 <foo> 具有 orderType 的专有性,即第一个列表为 0,第二个列表为 1 在第一个列表中,我进行过滤,我必须将第二个列表中的项目添加到受分页限制的结果中。 基本上这是我的最终查询:

var listFoo= QueryList1.Concat(QueryList2);  //(IQueriable)
List<foo> listFoo =listFoo.OrderByDescending(r => r.ID)
                          .ThenBy(d =>d.orderType)
                          .Skip((currentPageIndex - 1) * pageSize)
                          .Take(pageSize)
                          .ToList();

这很好用,因为列表 1 作为主要项目,而列表 2 作为第一个列表的详细信息。此外,我的过滤器应该只适用于第一个列表。但问题来了。如何按日期订购第二个列表。我需要列出按日期排序的详细信息。 基本上我需要类似的东西:

List<foo> listFoo =listFoo.OrderByDescending(r => r.ID)
                          .ThenBy(d =>d.orderType)
                          .ThenBy(x=>(x.ordertype==1)?x.Date)
                          .Skip((currentPageIndex - 1) * pageSize)
                          .Take(pageSize)
                          .ToList();

编辑:

List 1 : 
id =1,ordertype=0,Date = new DateTime(1950,1,4),  [0]
id =2,ordertype=0,Date = new DateTime(1950,2,1)   [1]
List 2 :
id =1,ordertype=1,Date = new DateTime(1950,1,5),  [2]
id =1,ordertype=1,Date = new DateTime(1950,1,2),  [3]
id =1,ordertype=1,Date = new DateTime(1950,1,3),  [4]
id =1,ordertype=1,Date = new DateTime(1950,1,4)   [5]

This should be ordered as follows : 
[0],[3],[4],[5],[2],[1]

【问题讨论】:

  • 在我看来,您总是可以简单地按 ID、ordertype 和 Date 进行订购。订单类型 0 总是第一个具有相同的 ID。
  • 是的......你是对的。这是我将使用的解决方案.. 我会给斯坦利一个正确的答案,以防有人碰到我认为我遇到的问题。 (问题在于定义一个字段)。干杯队友

标签: c# asp.net-mvc asp.net-mvc-3 linq


【解决方案1】:

看起来您缺少三元运算符的最后一部分:

listFoo = listFoo.OrderByDescending(r => r.ID)
                           .ThenBy(d =>d.orderType)
                           .ThenBy(x => (x.ordertype==1) ? x.Date : DateTime.MinValue)
                           .Skip((currentPageIndex - 1) * pageSize)
                           .Take(pageSize)
                           .ToList();

如果您不关心顺序,如果 ordertype 不是 1,那么 else 条件是任意的。

【讨论】:

  • 这是那些“看起来很疯狂,可以工作”的时刻之一。用你的语法尝试过......但它没有用..但如果这种语法是可能的,它只是时间问题,直到我做对了。你可以在 Order by Lambda 表达式中使用该语法吗?
  • 当然 - 如果您修改了您的问题以准确概述订单标准是什么(使用示例数据),那将会很清楚。 ID是唯一的吗? ID 是两个列表之间的链接吗?
  • 添加编辑:ID 不是唯一的,它用于帮助从 2 个列表中对元素进行排序。 ordertype 使第一个列表中的元素位于详细元素(list2)的顶部。日期应该只对第二个列表中的元素进行排序)
  • 我修复了两件事 - MinDate 应该是 MinValue 并且您正在重新定义 listFoo 但将其用作源列表。我不知道这些是否是您的问题;如果它仍然不起作用,请解释 如何 它不起作用。我已经在 LinqPad 中验证了结果。
  • 问题出在我的列表创建中。我误解了规范。它很好用。谢谢
猜你喜欢
  • 2016-04-12
  • 2013-07-29
  • 1970-01-01
  • 2017-10-06
  • 2021-06-12
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
相关资源
最近更新 更多