如何通过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()
。
注:PersianBirthDate是char(10)
和 的数据类型PersianDateTime
库转换波斯日期到公历日期。
答
据@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)
'PersianBirthDate的数据类型是char(10)'。那是你的问题。通过将数据库列更改为实际日期字段来修复此问题。 – Servy 2014-09-05 14:41:59
我无法更改PersianBirthDate的数据类型。 :( – Amir 2014-09-05 14:44:22
由于该字符串包含年份,月份,日期的顺序,因此请进行字符串比较。将存储的字符串与包含波斯语日期的客户端格式化字符串进行比较 – KristoferA 2014-09-05 14:44:39