【问题标题】:convert string to DateTime in linq query with where clause?使用where子句在linq查询中将字符串转换为日期时间?
【发布时间】:2021-11-24 18:29:44
【问题描述】:

我正在尝试使用 EF 获取用户列表。我在表中有一个作为字符串数据类型的返回日期。现在我将这个返回日期与今天的日期进行比较,然后我得到了错误。所以有人知道如何在 C# 中将字符串转换为日期时间。

这是查询:

var res = db.users
  .Where(a => Convert.ToDateTime(a.returndate) > DateTime.Now)
  .ToList(); // but here not getting list

所以在 EF 字符串到 DateTime 的转换中是可能的。如果有人有想法,请告诉我。

【问题讨论】:

  • a.returndate的值是多少?
  • DD-MM-YYYY 这个格式存储
  • 不应该是 DD-MM-YYYY 而不是 DD-MM-YYY?
  • "那么我遇到了错误" - 什么错误?您是否必须在数据库中使用文本表示开始?如果您可以更改数据库以使用更合理的字段类型,那么处理它的 all 代码可能会变得更好......

标签: c# linq


【解决方案1】:

LINQ to Entities中不能使用Convert.ToDatetime方法,所以先从db获取数据再使用list上的方法

var res = db.users.ToList().Where(a => DateTime.ParseExact(a.returndate,"dd-MM-yyyy",CultureInfo.InvariantCulture) > DateTime.Now).ToList();

注意:如果您可以将columns data type 更改为DateTime 类型,那么您可以在LINQ To Entities比较它们,否则您应该按照上述操作 p>

【讨论】:

  • 使用您的解决方案,我得到了这样的错误“字符串未被识别为有效的日期时间”。
  • 获取整个表来过滤应用程序中的数据是不好的做法
  • @fubo 你是对的,如果这张表包含非常大的数据
  • 那么,解决这个问题的最佳方法是什么?
  • @coder 解决此问题的最佳方法是在数据库列中具有正确的数据类型。下一个最佳方法是将日期用作 ISO 格式的字符串 (yyyy-MM-dd HH:mm:ss),因此您至少可以比较文本表示而不需要转换。
【解决方案2】:

根据你的cmets提问你需要做的

var res = db.users.ToList().Where(a => DateTime.ParseExact(a.returndate, "dd-MM-yyyy", CultureInfo.InvariantCulture) > DateTime.Now);

在您的情况下,Convert.ToDateTime(string str) 无法正常工作,因为传递的DateTime 格式与您系统的格式不同。

顺便说一句,

....EF 字符串到日期时间的转换。

永远不要在数据库中存储 DateTime 字符串。数据库具有相应的 DateTime 类型,您可以在其中将信息存储为 DateTime 本身。这样,在带来值时,您就不必重复代码。

【讨论】:

  • LINQ to Entities 无法识别方法 'System.DateTime ParseExact(System.String, System.String, System.IFormatProvider)' 方法,并且此方法无法转换为存储表达式。我收到此错误。
  • 感谢大家的关注。
  • 不幸的是,添加ToList() 调用会强制执行SQL,而Where() 是在代码中执行的。
  • 是的。那是立即查询执行(与 LINQ 执行的延迟查询执行相反)。 OP也在他的问题中做ToList()。这里面有问题吗?
【解决方案3】:

使用当前架构,您只能获取所有对象的列表,然后对其进行过滤。

Linq to Entities 构造 SQL 查询,在枚举完成时执行。

所以只需获取完整列表,然后对其进行过滤。或者强烈建议更改数据库架构。

更新

var res = db.users.ToList().Where(a => DateTime.ParseExact(a.returndate, "dd-MM-yyyy", CultureInfo.InvariantCulture) > DateTime.Now); 

但在过滤之前加载了完整的表。所以你需要将你的字段类型更改为日期时间。然后你可以在Where里面使用简单的比较。

@NikhilAgrawal 也以正确的方式更新了他的答案。 )

【讨论】:

  • 你能给我提示如何做到这一点
  • 是的,这一波是正确的,但是在我的表中存储了很多数据,所以这个查询的工作速度非常慢,所以还有其他解决方案吗??
  • 我提到过 - 将字段类型更改为日期时间,这是唯一的方法。
【解决方案4】:

试试这个:

var res = db.users.where(a => DateTime.ParseExact(a.returndate,"dd-MM-yyyy",CultureInfo.InvariantCulture) > DateTime.now).ToList();

【讨论】:

  • DateTime.ParseExact 不会被翻译成sql语句
【解决方案5】:

您可以在列表中访问,然后应用如下过滤器-

var users=db.users.ToList();

var res=users.Where(a=>Convert.ToDateTime(a.returndate)>DateTime.Now).ToList();

【讨论】:

  • 坏建议:这会将整个表拉入内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多