【问题标题】:How to OrderBy Date stored in a Varchar field in EF4如何 OrderBy Date 存储在 EF4 的 Varchar 字段中
【发布时间】:2011-05-17 00:03:02
【问题描述】:

我们有一个旧数据库 (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;

感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

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

    你可以:

    1. 自己映射一个 DB 函数,
    2. 编写 SQL 并使用ObjectContext.ExecuteStoreQuery 执行它,或者
    3. 修复元数据。

    如果是我,我会选择后者。

    【讨论】:

    • 你能扩大一点吗。我将如何修复元数据?该数据库用于外部应用程序,我们只有读取权限。
    • 如果无法更改数据库,则无法修复元数据。这意味着您将不得不忍受不可索引的查询。
    • 感谢 Craig,我们将调查 ObjectContext.ExecuteStoreQuery 的想法,看看我们的进展如何。
    【解决方案2】:

    除非您创建自己的 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。

    【讨论】:

    • 它是一些外部软件的遗留数据库,因此以任何方式更改架构都不可行。
    【解决方案3】:

    varchar 字段中的顺序与日期字段中的顺序有很大不同。修复您的结构以正确存储日期或添加通过触发器填充的附加日期字段。很可能您那里也有错误的日期,因为 varchar 字段上没有控件可以拒绝输入日期。您还需要修复这些问题。

    【讨论】:

    • 它是一些外部软件的遗留数据库,因此以任何方式更改架构都不可行。
    • 可以添加一个以日期为日期的相关表格吗?
    • 不允许更改数据库本身,我们也许可以在本地数据库上拥有一个表并将数据复制到该表中,从而在途中转换狡猾的日期字段。目前我们正在调查 Craig 建议的 ObjectContext.ExecuteStoreQuery 想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2017-08-23
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多