【问题标题】:how to convert string into DateTime in where Clause?如何在where子句中将字符串转换为日期时间?
【发布时间】:2014-06-11 14:15:15
【问题描述】:

我必须将日历中选择的日期(startdat 和 enddat)与我的 SQL 2008 R2 DB 中的日期进行比较。我必须用 LINQ 编写它,但在我的视图中,DateTime 被转换为字符串(Varchar),所以我必须在我的 LINQ 查询中将它转换回 DateTime。我的基本查询现在看起来像这样:

var reportlist = (from r in context.Monthly_Report
                  where r.CreateDate >= startdat && r.CreateDate <= enddat
                  select r.Ticketnumber).ToList();

所以我得到的CreateDateString,为了比较我必须转换它。我已经用Convert.ToDateTime() 尝试过,但是 L2E 存在问题。 那么我怎样才能像在 SQL 脚本中那样转换它,或者 SQL 知道我的意思呢?

感谢我得到的每一个帮助。 (顺便说一句,我不允许更改视图)

【问题讨论】:

  • 有什么办法可以改变视图吗?这不仅仅是 LINQ 的问题 - 从根本上说,如果字段是日期,它不应该作为字符串返回。
  • @mxmissile 有人做出了糟糕的设计决定,所以现在你主张解雇他们?你不觉得这有点苛刻吗?显然这是一个坏主意,但每个人在学习时都会遇到很多坏主意
  • @JonSkeet 据我了解,OP 已将日期作为字符串存储在数据库中
  • 您可以创建另一个代理视图,将字符串转换回日期
  • 你可以尝试使用EntityFunctions.CreateDateTime,但是会很丑

标签: c# asp.net sql linq entity-framework


【解决方案1】:

您只能在 Linq to Entities 中使用一组精简的函数。该函数将被转换为 DB 函数。

你可以使用:

这些组都不包含可以从字符串转换为日期时间的函数,因此无法直接进行。

你必须寻找替代品:

  • 创建一个数据库视图,将“字符串化”日期时间公开为日期时间列并查询它
  • 创建一个存储过程并使用它
  • 尽可能将日期时间转换为字符串并进行比较(这取决于“字符串化”日期时间的样子)
  • 您可以使用以前的解决方案,使用子字符串(将映射到 DB 函数)。这适用于所有情况:重新排序“字符串化”dt 日期的 y、m、d,使其看起来像“yyyymmdd”。然后将您的startdatenddat 转换为相同的格式,并按字符串(字母)顺序进行比较。

【讨论】:

    【解决方案2】:

    基本上,您需要您的视图返回一个日期时间。

    但是,有几种方法可以做到这一点。

    1) 您可以将数据作为字符串提取到列表对象中。那么你就不会使用 L2E。

    var temp = (from r in context.Monthly_Report
                select new { r.Ticketnumber,  r.CreateDate} ).ToList();
    var reportList = temp.Where(r =>  
                                Convert.ToDateTime(r.CreateDate) >= startdat && 
                                Convert.ToDateTime(r.CreateDate) <= enddat)
    

    2) 您可以将日期时间转换为字符串值并进行比较。

    var reportlist = (from r in context.Monthly_Report
                      where r.CreateDate.CompareTo(startdatasstring) >= 0 && 
                            r.CreateDate.CompareTo(enddatasstring)  <= 0
                      select r.Ticketnumber).ToList();
    

    【讨论】:

    • 如果有数百万行怎么办?你刚刚杀死了他的应用
    • @mxmissile,我的第一行是真正的答案。处理数据的方式存在很大问题。也就是说,如果他别无选择,这些都是替代品。
    • 1) 我试过这个,但是 LINQ to Entities 有一个例外 - 它说 SQL 不理解 Convert.ToDateTime() 2) 为什么要 &gt;= 0 提供帮助?我需要所有早于startdat 且小于enddat 的票号。
    • @papogomez 如果他被“要求”使用 LINQ 你是对的,但是还有其他有效的解决方案。
    • @mxmissile,然后发布一个。我会赞成的。 :) 就目前而言,我认为我的是唯一可行的答案。
    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    相关资源
    最近更新 更多