比较Linq中的日期逻辑

时间:2014-02-17 08:08:41

标签: c# linq sql-server-2005 linq-to-sql

我想查询结果

public resultType GetData(int ClientID, DateTime CreatedDate)
{
    var Row = DB.tblPlans
                .Where(m => m.fkClient_Id == ClientID && m.PlanDate <= CreatedDate)
                .OrderByDescending(m => m.Id)
                .FirstOrDefault();
}

但结果并非如所需,因为查询中的“m.PlanDate”也在比较时间。 所以上面函数中的参数“CreatedDate”总是会附加“12:00:00 AM”,假设“2/17/2014 12:00:00 AM” 因为它是一个datepicker控件,我将它转换为datetime但是我必须比较它的创建日期的值是原始时间假设“2/17/2014 11:58:35 AM”

这就是为什么我没有得到理想的结果。

我认为如果时间部分被移除,结果将会很好。

我已经搜索了上述问题并且有很多解决方案,例如:: 使用AddDays(1);但我不确定它是否有效。 我也试过:: http://www.codeproject.com/Articles/499987/LINQ-query-to-compare-only-date-part-of-DateTime

请建议我更好的方法,因为这不是我第一次遇到这个问题。

3 个答案:

答案 0 :(得分:7)

如果你正在使用Linq to SQL(如你在问题标签中指定的那样),那么只需获取DateTime的Date部分:

var Row = DB.tblPlans
            .Where(m => m.fkClient_Id == ClientID && m.PlanDate.Date <= CreatedDate)
            .OrderByDescending(m => m.Id)
            .FirstOrDefault();

使用实体框架,您应该使用EntityFunctions.TruncateTime(m.PlanDate)

答案 1 :(得分:1)

你试过这个:

public resultType GetData(int ClientID, DateTime CreatedDate)
{
    var Row = DB.tblPlans
                .Where(m => m.fkClient_Id == ClientID && m.PlanDate.Date <= CreatedDate)
                .OrderByDescending(m => m.Id)
                .FirstOrDefault();
}

答案 2 :(得分:1)

如果您使用的是EntityFramework 6,则在linq查询中比较日期的推荐方法是DbFunctions.TruncateTime(m.PlanDate)和以前的版本EntityFunctions.TruncateTime(m.PlanDate)