繁体   English   中英

将日期与字符串实体框架进行比较

[英]Comparing date with string Entity Framework

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

Id int NOT NULL,
Date date NOT NULL

我有相应的实体框架模型:

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

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

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

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

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 ,那么一种(非常)简便,简洁的方法是创建并使用计算列

您可以这样创建(如果您使用“代码优先”和“迁移”,则Google会找到如何正确执行此操作)

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

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

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]

那你就可以做

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM