将日期与字符串entity framework进行比较

让我们假设我有一个SQL Server数据库和一个看起来像这样的表:

Id int NOT NULL, Date date NOT NULL 

我有相应的entity framework模型:

 public class Bundle { public int Id {get; set;} public DateTime Date {get; set;} } 

用户可以键入可以是任何内容的字符串。 我需要找到Date或日期的任何部分包含用户输入的字符串的所有项目。 所以,基本上,我需要执行查询:

 SELECT Id, Date FROM Bundles WHERE Date LIKE '%user_query_here%' 

我的第一次尝试是

 query.Where(b => b.Date.ToShortDateString().Contains(filter.Date)) 

这会引发NotSupportedException,所以我尝试了这个:

 query.Where(b => Convert.ToString(b.Date).Contains(filter.Date)); 

请注意, filter.Date是字符串。 它不是DateTime结构。

这也引发了一个例外。 所以我的问题是如何执行上面执行的查询?
PS:我无法在内存中执行过滤,这个表有几千行。

遗憾的是,没有简单的方法将日期时间转换为带有l2e的字符串。

您可以使用一些SqlFunctions方法

 SqlFunctions.DatePart 

将返回表示日期的一部分的int(例如,年,月,日)。

 SqlFunctions.StringConvert 

可以帮助您在字符串中转换int(将其转换为double,然后可以连接)。

就像是

 .Where(b => (SqlFunctions.StringConvert((double)SqlFunctions.DatePart("y", b)) + SqlFunctions.StringConvert((double)SqlFunctions.DatePart("m", b)) //etc. ).Contains(filter.Date) 

当然这是不可读的,而且真的不是索引友好的。

如果你正在使用sql server ,那么(更)更容易和更清洁的方法是创建和使用计算列

您可以像这样创建它(谷歌如果您使用代码优先和迁移,找到如何正确地执行此操作)

 alter table add StringDate as convert(varchar, [Date], 112)//or another format, this will be yyyymmdd 

如果您首先使用代码,则必须使用属性标记属性

 [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 

那你就能做到

 .Where(b => b.StringDate.Contains(filter.Date))