Entity framework 如何在C#EF核心查询中将字符串转换为DateTime
这是我的一个问题陈述的Linq。我想从当前日期和时间戳中获取记录未来日期记录,因此我正在将其转换并与Entity framework 如何在C#EF核心查询中将字符串转换为DateTime,entity-framework,linq,entity-framework-core,postgresql-9.1,ef-core-3.0,Entity Framework,Linq,Entity Framework Core,Postgresql 9.1,Ef Core 3.0,这是我的一个问题陈述的Linq。我想从当前日期和时间戳中获取记录未来日期记录,因此我正在将其转换并与Datetime进行比较,但出现以下错误: LINQ表达式“DbSet .Where(a=>Convert.ToDateTime(a.TextDate)>Convert.ToDateTime(DateTime.Now))“>无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或ToListSync()的调用
Datetime
进行比较,但出现以下错误:
LINQ表达式“DbSet.Where(a=>Convert.ToDateTime(a.TextDate)>Convert.ToDateTime(DateTime.Now))“>无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或ToListSync()的调用显式切换到客户端计算 注意:在Postgresql DB
TextDate
中,列具有字符串数据类型,并包含类似“4/1/2020 10:00 AM”的值
请提供解决方案。人们决定将日期时间值存储为字符串,然后命令数据库用户使用这些值进行计算,这总是让我感到困惑。我可以想象你会诅咒决定这么做的人,特别是因为他决定以这种不可排序的方式存储它 最佳解决方案 如果可能,请更改数据库,使其将日期时间存储为日期时间,或者如果您的数据库语言不知道如何执行此操作,请将日期时间的刻度存储为长。数据库的未来用户将赞美你的名字
var res = Context.Exampletable
.Where(s => s.CompanyId == CompanyId &&
Convert.ToDateTime(s.TextDate) >= DateTime.Now)
.Select(x => new Exampletable { TextDate = x.TextDate })
.FirstOrDefault();
几乎是最好的解决方案
如果将日期时间保存为字符串的决定是PostgreSQL开发人员的决定,那么请尝试找出他们是否有处理这些日期时间的函数,尤其是比较函数
“情况越来越糟”的解决方案
尝试了解PostgreSQL是否具有字符串操作功能,这样您就可以将2020年4月1日上午10:00转换为可比的内容。如果您想编写代码将此值与例如4/1/2019 10:00 AM或4/2/2020 10:00 AM进行比较是很困难的,因此我想如果您真的无法更改基础列类型,那么在SQL中执行此操作将是一项艰巨的任务,然后使用映射到PostgreSQLcast
运算符的C#cast运算符,而不是不支持的Convert.ToDateTime
运算符:
long nowTicks = DateTime.Now.Ticks;
var result = Context.Exampletable
.Where(example => example.CompanyId == CompanyId && example.DateTicks >= nowTicks);
请注意,只需将“中间”转换为对象
,即可使C#编译器满意
另外,我真的不知道为什么一些
Convert
的方法,比如ToInt32
是受支持的,而其他的方法,比如ToDateTime
是不受支持的。我猜这只是另一个EF核心不一致。它不起作用,因为Postgresql的LINQ to Entities实现不知道如何将convert.ToDateTime(string)
转换为SQLIvan Stoev,谢谢你的建议,我尝试了这一点,LinQ现在正在转换为SQL,但它只获取匹配的记录,如TextDate==DateTime.now和>=,这将令人惊讶,因为cast将字符串转换为时间戳数据类型,因此比较应该使用时间戳规则。请确保您正确使用它,例如,上面的转换为CAST(t.“TextDate”作为没有时区的时间戳)
,SQL中“没有给出正确输出”的部分看起来如何?Harald Coppoolse:感谢您提供了这个最终解决方案,,我创建了Datetimetick列,并按照建议存储了datetime的tikcs值,它工作得非常好。我能找到准确的记录。非常感谢:)
(DateTime)(object)s.TextDate >= DateTime.Now