gpt4 book ai didi

c# - 如何使用 linq 将日期(存储为字符串)与实体进行比较?

转载 作者:太空宇宙 更新时间:2023-11-03 12:41:21 26 4
gpt4 key购买 nike

我正在尝试通过开始/结束日期参数从数据库中提取数据。

但是,我需要过滤的日期作为字符串存储在 Oracle 数据库中。

如何使用 linq 根据我的参数(将采用 DateTime 类型)过滤日期?

我最初尝试过:

var test = context.MY_TABLE
.Include(x => x.MY_DETAILS)
.Where(x => startDate >= MyHelpers.ConvertDate(x.DATE_FIELD) &&
endDate <= MyHelpers.ConvertDate(x.DATE_FIELD))
.ToList();

我理解错误是因为 linq 无法从我的方法生成必要的 sql 语句。

那么如何将日期与以字符串形式存储在数据库中的 linq 进行比较?

要启动,我不知道日期将如何存储在字符串中。
目前我假设“3/10/2016 12:30:00”是日期字符串。

最佳答案

列表有多大?在 .NET 方面,最简单的方法是将字符串解析为 DateTime方法并比较结果。但是不可能在数据库端执行此操作,因为 EF 无法翻译像 DateTime.Parse 这样的方法。或者你的 MyHelpers.ConvertDate .
如果您的列表不是很大(您必须确定“large”的确切含义),您可以“全部下载到 .NET 中”并在那里处理数据。这可以通过调用 ToList 来完成。或 ToArray在调用第一个自定义方法之前。

var test = context.MY_TABLE
.Include(x => x.MY_DETAILS)
.ToList() // or .ToArray()
.Where(x => startDate >= MyHelpers.ConvertDate(x.DATE_FIELD) &&
endDate <= MyHelpers.ConvertDate(x.DATE_FIELD))
.ToList();

但是,如果您的结果集很大并且不需要完整的数据,那么此解决方案可能会很慢,这是非常浪费的。

我看到的另一种方式是,不访问 DbSet<T>但使用存储过程。此过程可以解析字符串,比较它们并只返回您真正需要的内容。
SP 可以像表数据一样在 EF 中轻松访问,但选择代码是在数据库端用 SQL 编写的。

RIanGillis 所述你可以使用 ExecuteSqlCommand而不是存储过程。此方法将 SQL 字符串作为参数,因此您可以使用数据库中可用的任何转换方法。它的工作方式类似于存储过程,但 SQL 语句将存储在 .NET 代码中。

关于c# - 如何使用 linq 将日期(存储为字符串)与实体进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38899368/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com