如何在EF4中的Varchar字段中存储OrderBy Date

时间:2011-05-16 14:48:49

标签: sql-server-2008 entity-framework-4 linq-to-entities

我们有一个遗留数据库(SQLServer 2008),其中包含数千行。每条记录都有一个logdate字段,该字段是日期,但以21/04/2010 16:40:12格式存储为varchar。

我们只需要返回日期中logdate所在的行,并按日期排序。我们可以撤回服务器上的所有行和过滤器,但这似乎是错误的,不会扩展。

有没有办法在Entity Framework 4中进行过滤和排序。

这是我们认为可行的,但它失败了。

from c in db.changes
where [DateTime]c.logdate > DateTime.Today()
orderby [DateTime]c.logdate
select c;

感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

您无法使用任何内置的L2E函数将字符串解析为数据库服务器上的日期。

你可以:

  1. 自己映射数据库功能,
  2. 编写SQL并使用ObjectContext.ExecuteStoreQuery
  3. 执行它
  4. 修复元数据。
  5. 如果是我的话,我会选择后者。

答案 1 :(得分:1)

除非您创建自己的LINQ函数,否则我不确定您是否可以通过纯LINQ执行此操作。如果您可以执行即席查询并让EF4将其转换回对象,就像您可以在DataContext.Translate LINQ2SQL方法上一样,您可以将其转换为:

CONVERT(datetime, logdate, 103)

因此您的查询将是:

SELECT
    *
FROM
    changes
WHERE
    CONVERT(datetime, logdate, 103) > GETDATE()
ORDER BY
    CONVERT(datetime, logdate, 103)

或者,如果您可以添加到架构(我假设您无法修改varchar列以将其本地存储为日期时间),您可以像这样添加计算列:

ALTER TABLE
    changes
ADD
    logdateDatetime AS CONVERT(datetime, logdate, 103) PERSISTED

然后查询logdateDatetime列而不是logdate。

答案 2 :(得分:0)

varchar字段中的顺序与日期字段中的顺序有很大不同。修复您的结构以正确存储日期或添加通过触发器填充的其他日期字段。可能你在那里也有不好的约会,因为varchar字段上没有控制来拨入日期。你还需要修复它们。