如何使用 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));
     

【问题讨论】:

给出更多成功和不成功匹配的例子... 您可能会发现在代码中将日期保留为 .NET DateTime,然后在页面上呈现时指定格式可能会更好。 DateTime 是第一类类型(例如。如果你减去其中两个,你会得到一个 TimeSpan 代表两个瞬间之间的时间段 老实说,我认为你最好放弃这个要求,转而要求用户提供完整的信息,例如从和到的范围,然后留在那里。对我来说,搜索“8”的日期是没有意义的。似乎唯一有用的时间是:“您在什么日期进行交易?” ...“呃。我不记得了。但我认为它在某个地方的日期有 8”。 答案更可能是“1998 年”或“1997 年 8 月,因为...”,这就是搜索日期的系统只提供一个范围的原因。你有一个范围,我认为把它留在那个位置而不是“整个 97 年 12 月,然后只有其中有 8 的日期”会很好。.. 【参考方案1】:

System.DateTime 提供类似ToShortDateString() 的方法。

这样,您可以得到 DateTime 对象的日期部分,格式为字符串。见System.DateTime.ToShortDateString()

【讨论】:

你确定可以翻译吗? 你这是什么意思?【参考方案2】:

您可以在约会时致电ToString() 这样做:

expensesValues = expensesValues.Where(s =&gt; 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 服务器本身中进行过滤。性能好,代码简单

【讨论】:

LIKEdate 列上不太可能有良好的性能 @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)/

如何将 SQL 日期转换为 DateTime?

Linq to SQL DateTime 值是本地的(Kind=Unspecified)-如何使它成为 UTC?

如何计算 LINQ 中 DataTable 的列的总和(到数据集)?