查找可为空的DateTime包含关键字

时间:2017-08-01 08:41:35

标签: c# linq iqueryable

我有一个可以为空的DateTime模型。我尝试使用IQueryable对象并查找DateTime与字符串匹配的所有条目(如果已设置):

query.Where(s => s.MyDate.HasValue && s.MyDate.Value.ToString("{ 0:dd.MM.yyyy}").Contains(keyword));

然而,这不起作用,因为抛出异常:LINQ to Entities does not recognize the method 'System.String ToString(System.String)' method, and this method cannot be translated into a store expression.

在我做了一些研究之后,问题似乎是我的条件无法转换为SQL。

我该如何解决这个问题?

向用户显示的示例数据:

  • 10.03.2017
  • 01.08.2017

可能的搜索字词:

  • 08
  • 08.07
  • 2017年7月8日
  • 2017年7月8日
  • ...

2 个答案:

答案 0 :(得分:1)

由于您不关心日期格式(假设用户知道他们要查询的内容),只需使用SQL Server默认转换:

query.Where(s => s.MyDate.HasValue && s.MyDate.Value.ToString().Contains(keyword));

答案 1 :(得分:0)

如果您正在使用实体框架:让我们假设s是DemoClass类型:

public partial class DemoClass 
{
  public Nullable<DateTime> MyDate;
  ...
}

将是您实体的DemoClass.cs。只需在一个额外的文件中添加一个额外的部分类(这是最佳方式,否则EF可以覆盖您的编辑,如果您正在使用设计师,例如。)

DemoClass_Additional.cs

public partial class DemoClass 
{
  [NotMapped]
  public string MyDateString {
    get
    { 
      if(this.MyDate.HasValue)
      {
        return this.MyDate.Value.ToString("{ 0:dd.MM.yyyy}");
      }
      else
      {
        return "";
      }
    }
}

[NotMapped]将从数据库映射中排除该属性,最后您的查询将是

 query.Where(s => s.MyDate.HasValue && s.MyDateString.Contains(keyword));