【问题标题】:How to compare a string column(as DateTime) in LINQ?如何比较 LINQ 中的字符串列(如 DateTime)?
【发布时间】:2012-07-02 02:58:26
【问题描述】:

我有一个带有 ValidDate 字段的数据库 - 它是一个字符串(我们弄错了,它应该是日期时间,但我们现在无法修改数据库。)

现在我想将此文件与网站上的参数(validDateStart)进行比较:

priceList = priceList.Where(p => Convert.ToDateTime(p.ValidDate) >= Convert.ToDateTime(validDateStart));
var list = initPriceList.ToList();

但是我得到一个错误:方法 ToDateTime 没有实现。

谁能帮帮我?谢谢!

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    Linq to Entities 不支持此功能(据我所知,Linq to SQL 也不支持)。请记住,您的查询是在数据库中执行的 - 这里根本没有 Convert.ToDateTime 的等价物。

    您的查询中的任何字符串解析实际上只是一种解决方法 - 作为一个真正的解决方案,使这些列不是字符串而是数据库中的datetime,并且您首先不会遇到这个问题。

    一个 hacky 解决方法是将所有行具体化(您可以使用 AsEnumerable()),然后进行解析 - 虽然这会产生糟糕的性能,但如果行数很少,可能会足够好:

    var startDate = DateTime.Parse(validDateStart);
    var list = priceList.AsEnumerable()
                        .Where(p => DateTime.Parse(p.ValidDate) >= startDate);
                        .ToList();
    

    编辑:

    通过您的示例更新,您似乎可以只进行 字符串比较 来做您想做的事 - 当然它仍然是一个 hack,但比实现所有行的性能要好得多。这是可能的,因为您的日期格式将最重要的数字放在首位,然后是不太重要的部分 - 它是年份,然后是月份,然后是日期(如果不是这种情况,并且在您的示例中日期在月份之前,此解决方案将不起作用)。

    假设您的输入字符串 validDateStart 的格式也相同,您可以这样做:

    var list = priceList.Where(p => p.ValidDate.CompareTo(validDateStart) >=0);
                        .ToList();
    

    String.CompareToLinq to Sql 似乎都支持字符串比较Linq to Entities

    【讨论】:

    • 是的,你是对的,如果我将 AsEnumerable() 用于 priceList,效果会很好。但是正如你所说,我的记录太多,无法一次请求获得所有记录,性能太差了。谢谢!
    • 您的字符串列采用什么日期格式?如果是 ISO8601,你可以不用字符串比较——你有例子吗?
    • 带字符串比较?我试过“priceList = priceList.Where(p => p.ValidDate.CompareTo(validDateStart) > 0);” ,但仍然得到相同的错误:方法 CompareTo 未实现:(
    • 你能举例说明数据库中的日期字符串是什么样的吗?
    • 字符串数据库中的字符串是什么样子的...例如"2012-05-12"
    【解决方案2】:

    如果您数据库中的所有记录总是以年、月和日开头(例如:日期格式为 yyyy-MM-dd HH:mm:ss 或 yyyy/MM/dd 或 yyyyMMdd),无论是否有分隔符与否。问题是值应该具有以年、月和日开头的格式。

    您可以执行以下操作:

    1:将过滤器值(网站)转换为与数据库中相同的格式:

    // DateTime format in database: yyyy-MM-dd HH:mm:ss:ffffff
    var from = filtro.CreationDateFrom?.ToString("yyyy-MM-dd");
    var to = filtro.CreationDateTo?.AddDays(1).ToString("yyyy-MM-dd");
    

    2:然后像这样编写您的查询(使用 CompareTo 方法):

    var query = (from x in ctx.TskTaskQueues
                 where x.CreationDatetime.CompareTo(from) >= 0 
                 && x.CreationDatetime.CompareTo(to) <= 0
                 select x);
    

    它对我有用! 我没有使用 LinqToEntities,但我使用的是类似于 LinqEntities 的 LinqConnect(用于 Oracle)。

    如果你使用 dd-MM-yyyy 这样的格式,它可能不会起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 2020-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多