【发布时间】: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