【问题标题】:LINQ throwing exception when attempting to compare dates尝试比较日期时 LINQ 抛出异常
【发布时间】:2017-02-11 00:43:59
【问题描述】:

我有以下:

return db.Events
            .Where(e => 
                e.BedId == bed 
                && e.Date.Year == date.Year 
                && e.Date.Month == date.Month
                && e.Date.Day == date.Day)
            .Select(x => new EventViewModel() { 
                Id          = x.Id,
                Date        = x.Date.Date.ToString(),
                StartTime   = x.StartTime.ToString(),
                EndTime     = x.EndTime.ToString(),
                Planned     = x.Planned,
                EngineSN    = x.EngineSN,
                Details     = x.Details,
                Bed         = x.Bed.Name,
                Category    = x.Subcategory.Category.Name,
                Subcategory = x.Subcategory.Name,
                Project     = x.Project.Name,
                Type        = x.Type.ToString()
            })
            .ToList();

它抱怨member 'date' is not supported by LINQ

我知道 LINQ 不能处理日期,因为它不知道如何读取和比较它们。这就是为什么我特别要求它比较YearMonthDay属性(都是ints)。我的查询中的什么引发了这个异常?

附: EventViewModel.DateString

【问题讨论】:

  • 这是 LINQ To Entities,这意味着您的查询最终必须转换为 SQL。检查答案:stackoverflow.com/questions/11663523/…
  • 你是什么意思 LINQ 不能处理日期? LINQ绝对可以。 LINQ 可以处理任何类型,这就是语言集成查询的全部意义所在。您是否使用特定框架,例如 LINQ to SQL 或 LINQ to Entities?
  • @pymaxion 抱歉,我的意思是在处理实体和 SQL 时。
  • 我相信,where 子句中的日期不是问题,问题出在您的 SELECT 中。可能在 x.Date.Date.ToString()。尝试相同的语句,但不包括 SELECT 部分。
  • @Shashibhushan 你是对的,注释掉x.Date.Date.ToString() 的作品。可能是什么问题?

标签: c# linq datetime


【解决方案1】:

您需要更改您的查询,这样您就不会在 DateTime 上调用 Date 属性并更改您的视图模型。

将您定义为字符串的 DateTime 属性定义为 DateTime。 像这样注释 DateTime 属性

[DataType(DataType.Date)]
[DisplayFormat(DataFormatString = "{0:dd/MM/yyyy}", ApplyFormatInEditMode = true)]
public DateTime? Date{ get; set; } 

或您在 UI 中使用的任何日期格式。

像这样更改您的查询

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

        return db.Events
        .Where(e =>
            e.BedId == bed
            && e.Date >= startDate
            && e.Date < endDate)
        .Select(x => new EventViewModel()
        {
            Id = x.Id,
            Date = x.Date,
            StartTime = x.StartTime,
            EndTime = x.EndTime,
            Planned = x.Planned,
            EngineSN = x.EngineSN,
            Details = x.Details,
            Bed = x.Bed.Name,
            Category = x.Subcategory.Category.Name,
            Subcategory = x.Subcategory.Name,
            Project = x.Project.Name,
            Type = x.Type.ToString()
        })
        .ToList();

【讨论】:

    【解决方案2】:

    看起来您正在尝试做的是在比较和投影中排除日期的时间部分。如果是这种情况,请使用 DbFunctions。

    .Where(DbFunctions.TruncateTime(e.Date == date))
    

    然后

    Date = DbFunctions.TruncateTime(x.Date)
    

    【讨论】:

      【解决方案3】:

      LINQ 与其他人提到的日期一起使用。在x.Date.Date.ToString()抱怨的是你的SELECT

      【讨论】:

      • 在 ToString 中是 SQL 中不可用的方法,因此在解析过程中找不到等效的 SQL 部分。这是我的理解。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2021-10-06
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多