如何将linq与实体的日期(存储为字符串)进行比较?

时间:2016-08-11 14:36:07

标签: c# linq

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

但是,我需要过滤的日期在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'将是日期字符串。

1 个答案:

答案 0 :(得分:1)

名单有多大?在.NET方面,最简单的方法是将字符串解析为DateTime方法并比较结果。但是在数据库方面无法做到这一点,因为EF无法翻译DateTime.ParseMyHelpers.ConvertDate等方法。 如果您的列表不是很大(您必须确定“ large ”的确切含义),您可以“全部下载到.NET”并在那里处理数据。这可以通过在调用第一个自定义方法之前调用ToListToArray来完成。

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代码中。