运算符> =不能应用于string和datetime类型的操作数

时间:2016-01-28 13:52:52

标签: c# linq datetime asp.net-web-api2

用户在网址中输入两个参数,即开始日期和结束日期,并以格式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; }
}

4 个答案:

答案 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

话虽如此,通过转换,您正在验证数据,如果数据格式不正确,可能会显示错误。