比较linq中的日期

时间:2014-10-22 21:23:40

标签: c# linq datetime datetime-comparison

我有一个字符串31-10-2014,我想与数据库中的值进行比较。

public ActionResult SearchResult(string searchDate)
{
    var bookings = from m in db.Bookings
                   select m;
    if (!String.IsNullOrEmpty(searchDate))
    {
        bookings = bookings.Where(s => s.Date1.CompareTo( DateTime.ParseExact(searchDate, "dd-mm-yyyy", CultureInfo.InvariantCulture)) >= 0);
    }
    return View(bookings);
}

比较保持失败,我应该如何将输入日期与数据库值进行比较(我将try catch用于验证输入是数据时间,因此示例更清晰)

我收到消息(即使没有searchData):

  

Linq无法识别ParseExact方法。

4 个答案:

答案 0 :(得分:6)

它试图将DateTime.ParseExact编译成SQL,然后失败。您只需要定义一个变量并将值放入该变量,然后在查询中使用该变量:

if (!String.IsNullOrEmpty(searchDate))
{
    DateTime dt = DateTime.ParseExact(searchDate, "dd-mm-yyyy", CultureInfo.InvariantCulture);
    bookings = bookings.Where(s => s.Date1 >= dt);
}

答案 1 :(得分:2)

这取决于变量db是什么。如果它是LINQ to SQL DataContext或EF DBContext,则无法使用您在日期使用的方法;没有支持。见this。有一些SQL函数可以解决这个问题。

如果您想要日期的原始SQL支持,请使用EntityFunctions class,它可以让您进行日期比较。 CompareTo也不受支持,因此您必须使用传统的大于。

答案 2 :(得分:0)

您在第7行的代码中有一个-而不是=

这是正确的代码。

public ActionResult SearchResult(string searchDate)
{
    var bookings = from m in db.Bookings
                   select m;
    if (!String.IsNullOrEmpty(searchDate))
    {
        bookings = bookings.Where(s => s.Date1.CompareTo( DateTime.ParseExact(searchDate, "dd-mm-yyyy", CultureInfo.InvariantCulture) >= 0);
    }
    return View(bookings);
}

答案 3 :(得分:0)

要以更简单的方式进行,请尝试以下方法:

bookings = bookings.ToList().Where(s => s.Date1.CompareTo( DateTime.ParseExact(searchDate, "dd-mm-yyyy", CultureInfo.InvariantCulture)) >= 0);

首先将它放在一个列表中,这样它就不会将DateTime.ParseExact作为SQL语句,因为SQL中没有DateTime.ParseExact。

希望这有帮助