如何使用 linq 将 DATETIME 类型的列转换为字符串
Posted
技术标签:
【中文标题】如何使用 linq 将 DATETIME 类型的列转换为字符串【英文标题】:How can I convert a colum of DATETIME type to string with linq 【发布时间】:2021-10-28 14:31:27 【问题描述】:我有一个包含三列 ID、Date、Expenses 的表,我试图在 Date 列中搜索一个 int(Date 列中的数据类型是 DateTime)。例如,如果年份是 1998,输入是 8,则应该显示整行。
这是我的代码:
public ActionResult Get(string searchString)
DateTime? startDate = new DateTime(2016, 1, 1);
DateTime? endDate = new DateTime(2018, 12, 5);
AccountingEntities db = new AccountingEntities();
var expensesValues = from s in db.Expenses
select s;
if (startDate.HasValue)
expensesValues = expensesValues.Where(s => s.Date > startDate && s.Date < endDate);
//This line gives error, I need to convert the s.Date to string so I can use Contains
expensesValues = expensesValues.Where(s => s.Date.Contains(searchString));
【问题讨论】:
给出更多成功和不成功匹配的例子... 您可能会发现在代码中将日期保留为 .NETDateTime
,然后在页面上呈现时指定格式可能会更好。 DateTime
是第一类类型(例如。如果你减去其中两个,你会得到一个 TimeSpan
代表两个瞬间之间的时间段
老实说,我认为你最好放弃这个要求,转而要求用户提供完整的信息,例如从和到的范围,然后留在那里。对我来说,搜索“8”的日期是没有意义的。似乎唯一有用的时间是:“您在什么日期进行交易?” ...“呃。我不记得了。但我认为它在某个地方的日期有 8”。
答案更可能是“1998 年”或“1997 年 8 月,因为...”,这就是搜索日期的系统只提供一个范围的原因。你有一个范围,我认为把它留在那个位置而不是“整个 97 年 12 月,然后只有其中有 8 的日期”会很好。..
【参考方案1】:
System.DateTime
提供类似ToShortDateString()
的方法。
这样,您可以得到 DateTime 对象的日期部分,格式为字符串。见System.DateTime.ToShortDateString()
【讨论】:
你确定可以翻译吗? 你这是什么意思?【参考方案2】:您可以在约会时致电ToString()
这样做:
expensesValues = expensesValues.Where(s => s.Date.ToString().Contains(searchString));
【讨论】:
小心;它可能在服务器中使用一种格式,该格式使用例如命名月份,然后它不会在例如 1999-08-01 的日期中找到“8”。见docs.microsoft.com/en-us/ef/core/providers/sql-server/functions【参考方案3】:您可以使用实体框架核心中的 EF.Functions() 方法,如下所示
var expensesValues = await db.Expenses.Where(w => EF.Functions.Like(w.Date.ToString(),"%" + searchString + "%")).ToListAsync();
这将在 SQL 服务器本身中进行过滤。性能好,代码简单
【讨论】:
LIKE
在date
列上不太可能有良好的性能
@Charlieface,您好,是否可以在此分享您的基准。谢谢
brentozar.com/archive/2010/06/sargable-why-string-is-slow 请注意,对于日期列,在末尾添加通配符并没有帮助,因为它无论如何都会强制隐式转换为文本【参考方案4】:
尽管有评论,但如果您确实想坚持此搜索,我建议您在单个组件上进行,那么您可以确定 EF 会将 C# 转换为 SQL 并搜索您期望的内容
expensesValues = expensesValues.Where(s =>
s.Date.Year.ToString().Contains(searchString) ||
s.Date.Month.ToString().Contains(searchString) ||
s.Date.Day.ToString().Contains(searchString)
);
如果你需要时间继续这个模式
这也节省了数据库不必要地进行字符串连接,但如果您正在寻找彻底的性能,我认为除了重新定义搜索的工作方式之外没有什么好的选择
【讨论】:
以上是关于如何使用 linq 将 DATETIME 类型的列转换为字符串的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark - 如何拆分具有 Datetime 类型的结构值的列?
如何判断 pandas 数据框中的列是不是为 datetime 类型?如何判断一列是不是为数字?
C# 使用linq处理返回带datetime类型数据 json显示/date(xxxxx)/