我试图通过开始/结束日期参数从数据库中提取数据。
但是,我需要过滤的日期在Oracle DB中存储为字符串。
使用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'将是日期字符串。
答案 0 :(得分:1)
名单有多大?在.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>
。此过程可以解析字符串,比较它们并仅返回您真正需要的字符串
可以像在表数据中那样在EF中轻松访问SP,但是选择代码在数据库端以SQL编写。
如RIanGillis所述,您也可以使用ExecuteSqlCommand代替存储过程。此方法将SQL字符串作为参数,因此您可以使用数据库中可用的任何转换方法。它的工作方式类似于存储过程,但SQL语句将存储在.NET代码中。