如何通过Linq-to-Entities比较两个波斯日期?

问题描述:

我有一个表作为跟随的Oracle 11g:如何通过Linq-to-Entities比较两个波斯日期?

Persons Table: 
|ID  |FirstName|LastName|PersianBirthDate| 
|1  |FName1 |LName1 |"1362/01/01" | 
|2  |FName2 |LName2 |"1359/05/01" | 
|3  |FName3 |LName3 |"1350/04/11" | 
|4  |FName4 |LName4 |"1355/02/10" | 
|5  |FName5 |LName1 |"1365/12/25" | 

当我希望得到他们的PersianDateBirthDate小于"1362/01/01"像如下行:

|ID  |FirstName|LastName|PersianBirthDate| 
|2  |FName2 |LName2 |"1359/05/01" | 
|3  |FName3 |LName3 |"1350/04/11" | 
|4  |FName4 |LName4 |"1355/02/10" | 

我用的EntityFramework下面的代码(代码优先):

using (var db = new MyContext()) 
{ 
    return (db.Persons 
      .Where(x=> 
         PersianDateTime.Parse(x.PersianBirthDate).ToDateTime() 
         < PersianDateTime.Parse("1362/01/01").ToDateTime()) 
      .ToList(); 
} 

但会出现以下情况例外:

LINQ to Entities does not recognize the method 'System.DateTime ToDateTime()' method, and this method cannot be translated into a store expression. 

我不能使用db.persons.AsEnumerable()

注:PersianBirthDatechar(10)和 的数据类型PersianDateTime库转换波斯日期公历日期

+2

'PersianBirthDate的数据类型是char(10)'。那是你的问题。通过将数据库列更改为实际日期字段来修复此问题。 – Servy 2014-09-05 14:41:59

+1

我无法更改PersianBirthDate的数据类型。 :( – Amir 2014-09-05 14:44:22

+4

由于该字符串包含年份,月份,日期的顺序,因此请进行字符串比较。将存储的字符串与包含波斯语日期的客户端格式化字符串进行比较 – KristoferA 2014-09-05 14:44:39

据@KristoferA评论,我们可以使用下面的代码:

db.Persons 
    .Where(x => x.PersianBirthDate.CompareTo("1362/01/01") < 0).ToList(); 

然后将下面的SQL发送到DB:

SELECT 
[Extent1].[ID] AS [ID], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName], 
[Extent1].[PersianBirthDate] AS [PersianBirthDate] 
FROM [dbo].[Persons] AS [Extent1] 
WHERE [Extent1].[PersianBirthDate] < N'1362/01/01' 

但我想,我们可以改进这个解决方案。

+0

另一个答案将不胜感激。 – Amir 2014-09-10 13:21:56

这应该工作:

p.Where(x => ((int)x.PersianBirthDate.Substring(0,4)) < year) || 
      (((int)x.PersianBirthDate.Substring(0,4)) = year) && ((int)x.PersianBirthDate.Substring(5,2) < month)) || 
      (((int)x.PersianBirthDate.Substring(0,4)) = year) && ((int)x.PersianBirthDate.Substring(5,2) = month) && ((int)x.PersianBirthDate.Substring(8,2) <= day) 
+2

除非EF适配器对于Oracle来说真的太棒了,这不会起作用 - 在你的查询中,大部分事情都没有SQL语句。 – 2014-09-05 15:55:36

+0

@SteveRuble这不是EF - 只是linq。 – Hogan 2014-09-05 15:57:32

+1

@Hogan:错误:'带有语句体的lambda表达式不能被转换成表达式树' – Amir 2014-09-05 17:19:04