【问题标题】:Orderby descending does not work with DateTimeOrderby 降序不适用于 DateTime
【发布时间】:2015-05-05 01:55:26
【问题描述】:

所以我得到了这个 linq-to-sql 查询:

DateTime dtePast = new DateTime(1970, 1, 1);

Datetime newestDate = (from e in tblExpenses
join rd in tblRepairDetails on e.ExpenseItemID equals rd.ExpenseItemID
orderby (DateTime)e.ExpenseDate descending
select e.ExpenseDate).DefaultIfEmpty(dtePast).First();

如果没有 .First() 方法,它会返回这 4 个日期的完整列表:

2013 年 3 月 18 日上午 12:00

2012 年 5 月 14 日上午 12:00

2012 年 2 月 7 日上午 12:00

2012 年 1 月 10 日上午 12:00

但是,使用 .First() 方法,它会返回 1/10/2012 而不是 3/18/2013。无论我尝试什么,都会返回最旧的日期而不是最新的日期。如何获取最新日期?我已经花了三个小时来解决这个问题。

==编辑#1==

下面是实际代码:

DateTime dteNewestOccurrance = (from ve in context.tblVehicleExpenses
join rd in context.tblVehicleRepairDetails on ve.ExpenseItemID equals rd.ExpenseItemID
where ve.VehicleID == strVehicleID && rd.ActivityName == a.ActivityID
orderby (DateTime)ve.ExpenseDate descending
select ve.ExpenseDate).DefaultIfEmpty(dtePast).First();

同样,此代码拒绝返回最新日期(2013 年 3 月 18 日)。我试过升序、降序、.OrderByDescending() 等,但它拒绝给出最新的日期。

==编辑#2==

好的,所以经过一些测试,这段代码可以工作:

var varOccurranceList = from ve in context.tblVehicleExpenses
  join rd in context.tblVehicleRepairDetails on ve.ExpenseItemID equals rd.ExpenseItemID
  where ve.VehicleID == strVehicleID && rd.ActivityName == a.ActivityID
  orderby (DateTime)ve.ExpenseDate descending
  select ve.ExpenseDate;

DateTime dteNewestOccurrance = DateTime.Now;
if (varOccurranceList.Count() > 0)
   dteNewestOccurrance = varOccurranceList.First();
else
   dteNewestOccurrance = dtePast;

似乎 .DefaultIfEmpty() 和/或 .First() 会破坏代码并导致意外结果。我想要么我不明白如何正确使用这两种 Linq 方法,要么它们有什么可怕的问题。我对此不满意。

【问题讨论】:

  • 您查看过它生成的 SQL 吗?请注意,您提供的代码甚至无法编译,这表明它不是您的真实代码。请发布您的真实代码 - 真实代码中的错误可能未显示,因为您在复制时不小心将其删除...
  • 不要将其添加为评论 - 将其编辑到您的问题中。
  • 只是好奇,为什么要在 oderby 子句中显式转换 ve.ExpenseDate?
  • milter:加入演员阵容是为了解决这个问题。演员表不是代码的第一次修订的一部分。顺便说一句,我觉得不需要这个 DateTime 演员表。
  • 为什么要先使用 OrderBy,然后使用 First()。这就是 Max() 的用途

标签: linq linq-to-sql


【解决方案1】:

假设 ExpenseDate 可以为空,试试这个:

DateTime dteNewestOccurrance = (from ve in context.tblVehicleExpenses
join rd in context.tblVehicleRepairDetails on ve.ExpenseItemID equals rd.ExpenseItemID
where ve.VehicleID == strVehicleID && rd.ActivityName == a.ActivityID
orderby ve.ExpenseDate descending
select ve.ExpenseDate).FirstOrDefault() ?? dtePast;

【讨论】:

  • 这给出了一个错误:“Operator '??'不能应用于 System.DateTime" 类型的操作数
  • 这就是为什么我说“假设 ExpenseDate 可以为空”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多