【问题标题】:Display Results by Date ASP.NET MVC按日期显示结果 ASP.NET MVC
【发布时间】:2015-11-20 03:40:04
【问题描述】:

谁能告诉我我哪里出了问题。我有一个错误列表,我希望能够按日期搜索。例如,如果我从日期选择器中选择了日期 20/08/2015,那么我希望列表仅显示该日期的错误。默认情况下,它将显示数据库中的所有错误,但在选择日期时,我只想显示该日期的错误。

控制器

[HttpPost]
public ActionResult Index(string sortOrder, int? page, DateTime? datePicker)
{
    ViewBag.CurrentSort = sortOrder;
    ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";

    DateTime userSelectedDate = DateTime.Parse(Request["datePicker"]);

    var applications = from s in db.ElmahErrors
                       where s.TimeUtc == userSelectedDate
                       select s;

    switch (sortOrder)
    {
        default:
            applications = applications.OrderByDescending(x => x.TimeUtc);
            break;
    }

    int pageSize = Int32.Parse(System.Configuration.ConfigurationManager.AppSettings["DefaultPageSize"]);
    int pageNumber = (page ?? 1);
    return View(applications.ToPagedList(pageNumber, pageSize));
}

查看

 @using (Html.BeginForm())
{
    <label for="datePicker">Find By Date:</label>

    @Html.TextBox("datePicker", null, new { @type = "date" })

    <input id="submitBtn" type="submit" value="Search" />
}

userSelectedDate 变量正在从日期选择器中获取值,但它与任何错误都不匹配。有人可以帮忙吗?

提前致谢。

【问题讨论】:

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


【解决方案1】:

我认为你的s.TimeUtc 显然永远不会等于userSelectedDate

为什么,因为你有一个 datePicker 这意味着你不能在上面选择时间,然后你将它解析为一个 DateTime ,它默认 time 为某个值,然后你将它与 s 进行比较。 TimeUtc 和我相信这将是一个毫秒的比较,您在最近十年内不太可能达到。

所以我建议你做类似的事情

s.TimeUtc.ToLocalTime().Date == userSelectedDate.Date

【讨论】:

  • 不幸的是,虽然我的第一直觉也是,EF 不会正确评估它以便能够将比较作为谓词的一部分。我建议的 TruncateTime 方法正是这样做的,它从等式中删除了时间元素(设置为给定日期的午夜)。
  • 我和 EF 合作的不多,所以我的回答可能并不适合具体情况
【解决方案2】:

正如 @Chris Disley 指出的,您需要根据日期选择错误。通常的方法是当你有一个日期时,选择日期在日期和第二天之间的所有行。像这样的:

[HttpPost]
public ActionResult Index(string sortOrder, int? page, DateTime? datePicker)
{
    ViewBag.CurrentSort = sortOrder;
    ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";

    DateTime userSelectedDate = DateTime.Parse(Request["datePicker"]);

    var startDate = userSelectedDate.Date;
    var endDate = startDate.AddDays(1);

    var applications = from s in db.ElmahErrors
                   where s.TimeUtc >= startDate && s.TimeUtc < endDate
                   select s;

    switch (sortOrder)
    {
        default:
            applications = applications.OrderByDescending(x => x.TimeUtc);
            break;
    }

    int pageSize = Int32.Parse(System.Configuration.ConfigurationManager.AppSettings["DefaultPageSize"]);
    int pageNumber = (page ?? 1);
    return View(applications.ToPagedList(pageNumber, pageSize));
}

【讨论】:

  • 有什么方法可以在不使用[HttpPost]的情况下做到这一点,因为我想实现使用FormMethod.Get的PagedList
  • @D.M,是的。只需将[HttpPost] 替换为[HttpGet] 并确保路由引擎选择正确的路由。
【解决方案3】:

您根据 DateTime 而不是 Date 进行选择,因此记录必须在 DateTime 变量设置的准确时间(精确到毫秒)发生。要执行您所追求的,您需要对您的选择查询做更多的事情来匹配日期部分。有几种方法可以做到这一点,但这个 SO 问题很好地总结了它们:

How to compare only date components from DateTime in EF?

本质上,最简单的方法是在谓词中的两个日期上使用 EntityFunctions.TruncateTime 方法。

【讨论】:

  • 抱歉。刚刚意识到此方法已被 DbFunctions.TruncateTime(DateTime) 取代。相同的代码可以用一个替换另一个。
猜你喜欢
  • 2012-11-06
  • 2021-09-18
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多