Ted*_*edS 5 linq entity-framework postgresql-9.1 entity-framework-core ef-core-3.0
var res = Context.Exampletable
.Where(s => s.CompanyId == CompanyId &&
Convert.ToDateTime(s.TextDate) >= DateTime.Now)
.Select(x => new Exampletable { TextDate = x.TextDate })
.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
这是我的问题陈述之一的 Linq。我想从当前日期和时间戳中获取记录未来的日期记录,因此我正在将其转换并比较,Datetime
但出现此错误:
LINQ 表达式 'DbSet
.Where(a => Convert.ToDateTime(a.TextDate) > Convert.ToDateTime(DateTime.Now))' > 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估
注意:在 Postgresql DB 中,TextDate
列具有字符串数据类型并包含诸如“4/1/2020 10:00 AM”之类的值。
请为此提供解决方案。
如果您确实无法更改基础列类型,则Convert.ToDateTime
可以使用映射到 PostgreSQL 运算符的 C# 强制转换运算符来代替不受支持的CAST
类型:
(DateTime)(object)s.TextDate >= DateTime.Now
Run Code Online (Sandbox Code Playgroud)
请注意,需要“中间”转换为object
只是为了让 C# 编译器满意。
PS我真的不知道为什么有些Convert
类似的方法ToInt32
受支持,而另一些则不ToDateTime
支持。我猜这只是 EF Core 的另一个不一致之处。
人们决定将 DateTime 值存储为字符串,然后命令数据库用户使用这些值进行计算,这总是让我感到困惑。我可以想象你会想诅咒决定这样做的人,特别是因为他决定以这种不可排序的方式存储它。
如果可能,请更改数据库,以便将 DateTimes 存储为 DateTimes,或者如果您的数据库语言不知道如何执行此操作,请将 DateTimes 的 Ticks 存储为 long。数据库的未来用户将荣耀您的名字!
long nowTicks = DateTime.Now.Ticks;
var result = Context.Exampletable
.Where(example => example.CompanyId == CompanyId && example.DateTicks >= nowTicks);
Run Code Online (Sandbox Code Playgroud)
如果将 DateTimes 保存为字符串的决定是 PostgreSQL 开发人员的决定,那么尝试查找他们是否有处理这些日期时间的函数,尤其是比较
尝试找出 PostgreSQL 是否具有字符串操作函数,以便您可以将 4/1/2020 10:00 AM 翻译为 IComparable。如果您想编写代码来将此值与例如 4/1/2019 10:00 AM 或 4/2/2020 10:00 AM 进行比较是很困难的,所以我想这样做会是一项艰巨的工作在 SQL 中
归档时间: |
|
查看次数: |
3365 次 |
最近记录: |