Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何在C#EF核心查询中将字符串转换为DateTime_Entity Framework_Linq_Entity Framework Core_Postgresql 9.1_Ef Core 3.0 - Fatal编程技术网

Entity framework 如何在C#EF核心查询中将字符串转换为DateTime

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()的调用

这是我的一个问题陈述的Linq。我想从当前日期和时间戳中获取记录未来日期记录,因此我正在将其转换并与
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中执行此操作将是一项艰巨的任务,然后使用映射到PostgreSQL
cast
运算符的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