用户在网址中输入两个参数,即开始日期和结束日期,并以格式yyyyMMddhhmm
作为字符串输入。我正在尝试将这些字符串转换为日期,以便查询我的数据库。
[ResponseType(typeof(Detail))]
public IHttpActionResult GetDetail(string StartDate, string EndDate)
{
DateTime StartDateTime;
DateTime EndDateTime;
StartDateTime = new DateTime();
EndDateTime = new DateTime();
StartDateTime = DateTime.ParseExact(StartDate, "yyyyMMddhhmm", null);
EndDateTime = DateTime.ParseExact(EndDate, "yyyyMMddhhmm", null);
var detail = from a in db.Details where (a.callDate >= StartDateTime && a.callDate <= EndDateTime) select a;
var Response = new DetailResponse() { status = true, calls = detail };
return Ok(response);
}
但是我收到的错误是&gt; =无法在日期时间和字符串中使用。
修改 为了答案之一,我将包括一个我用来显示数据的模型类。
DetailResponse.cs
public class DetailResponse
{
public bool status { get; set; }
public string statusMessage { get; set; }
public IQueryable<Detail> calls { get; set; }
}
答案 0 :(得分:7)
可能会发生这种情况,因为callDate
是一个字符串。因此,您无法将字符串与日期时间进行比较。这个问题的解决方案是使用相同的类型。话虽如此,我会将a.callDate
转换为DateTime
。
但是,我认为在数据库级别更改callDate
的数据类型会更好。毫无疑问,这是个人意见。所以你不必遵循它。这样做你的代码不需要任何改变。
现在,就代码而言,我上面提出的解决方案如下:
var allDetails = db.Details.AsEnumerable();
var details = from detail in details
let callDate = DateTime.ParseExact(detail.callDate, "yyyyMMddhhmm", null)
where callDate >= StartDateTime
&& callDate <= EndDateTime
select detail;
<强>更新强>
正如我们在评论中总结的那样,我们必须调用AsEnumerable
,以便上述查询起作用。为什么需要这个?
借用Reimplementing Linq to Objects: Part 36 – AsEnumerable
中的Jon Skeet的话现在想要执行某些方面并不是完全不常见的 在数据库中查询,然后在.NET中进行更多操作 - 特别是如果有基本上你无法实现的方面 LINQ to SQL(或您正在使用的任何提供程序)。例如,你可以 想要构建一个特定的内存表示,而不是真的 适合提供者的模式。
无法在数据库方法中正确翻译DateTime.ParseExact
。
答案 1 :(得分:1)
您的比较失败,因为数据库中的日期是字符串类型,请尝试这样做:
[ResponseType(typeof(Detail))]
public IHttpActionResult GetDetail(string StartDate, string EndDate)
{
DateTime StartDateTime = DateTime.ParseExact(StartDate, "yyyyMMddhhmm", null);
DateTime EndDateTime = DateTime.ParseExact(EndDate, "yyyyMMddhhmm", null);
var detail = from a in db.Details where (DateTime.ParseExact(a.callDate, "yyyyMMddhhmm", null) >= StartDateTime &&
DateTime.ParseExact(a.callDate, "yyyyMMddhhmm", null) <= EndDateTime) select a;
}
但是,最好将callDate
的类型改为日期而不是string
。
答案 2 :(得分:0)
您的架构是什么样的?是callDate
一个字符串?在进行比较之前,您可能需要将callDate
转换为DateTime
。
var detail = from a in db.Details where (Convert.ToDateTime(a.callDate) >= StartDateTime && Convert.ToDateTime(a.callDate) <= EndDateTime) select a;
答案 3 :(得分:0)
正如已经说过的那样,你不能将字符串与DateTime进行比较,但是,鉴于日期格式是
表示为yyyymmddhhmm
(即年月日小时分钟),其中值均为数字且来自最小变化 - &gt;大多数变化你都可以安全地进行字符串比较:
var detail = from a in db.Details where (a.callDate >= StartDate && a.callDate <= EndDate) select a;
这是因为&#34; 201601010101&#34;小于&#34; 201612312359&#34;在比较字符串时(与&#34; a&#34;小于&#34; b&#34;)的方式相同。
这样可以节省您将数据转换为DateTime
。
话虽如此,通过转换,您正在验证数据,如果数据格式不正确,可能会显示错误。