【问题标题】:How to deal with dates in Linq Query?如何处理 Linq Query 中的日期?
【发布时间】:2011-05-16 13:13:34
【问题描述】:

我收到了NotSupportedException

方法 'System.TimeSpan FromMinutes(Double)' 不支持 SQL 转换。

运行此查询时:

var searchSchedules =
    from searchSchedule in db.SearchSchedules
    where searchSchedule.Active.Value &&
          searchSchedule.LastChecked.Value <
            DateTime.UtcNow.Subtract(TimeSpan.FromMinutes(
              searchSchedule.CheckFrequencyMinutes)) &&
          searchSchedule.PublishingConfigurationId == pubConfig.Id
          select searchSchedule;

显然问题出在查询的TimeSpan 部分。我怎样才能做到这一点?

【问题讨论】:

    标签: c# linq date


    【解决方案1】:

    如果您只是想检查自上次检查后是否经过了指定的分钟数,您可以这样重写:

    var searchSchedules =
        from searchSchedule in db.SearchSchedules
        where searchSchedule.Active.Value &&
                ((DateTime.UtcNow - searchSchedule.LastChecked.Value).Minutes >= searchSchedule.CheckFrequencyMinutes) &&
              searchSchedule.PublishingConfigurationId == pubConfig.Id
              select searchSchedule;
    

    【讨论】:

    • 谢谢,我最终使用了您的解决方案。
    【解决方案2】:

    一种方法是将此查询分成两部分。一个对数据库执行,第二个在客户端执行,如下:

    // This executes against the database
    var query1 = from searchSchedule in db.SearchSchedules
                 where searchSchedule.Active.Value
                 && searchSchedule.PublishingConfigurationId == pubConfig.Id
                 select searchSchedule;
    
    // This executes on the client
    var query2 = from query1 as IEnumerable()
                 where query1.LastChecked.Value < DateTime.UtcNow.Subtract(TimeSpan.FromMinutes(query1.CheckFrequencyMinutes))
    

    当我想在查询中包含一个 SQL Server 不知道如何处理的函数时,我经常做这样的查询。在第二个查询中,将 query1 转换为 IEnumerable 将强制它在客户端上执行,针对 .NET 框架,而不是您的数据库。

    您将需要确定客户端可能需要处理多少行,以确定这可能有多有效。

    【讨论】:

    • 这种方法在处理大型数据集时会导致效率非常低的情况,因为数据库可以简单地使用非常快速的索引列,客户端将遍历返回的整个 IEnumerable。
    • 我也使用这种方法,但经常担心无法预料的数据量可能会被带回客户端,然后被 where 子句丢弃。
    • 这当然是可能的。我只是将其作为替代方案。第一个查询已经有两个过滤器。您需要确定客户端可能需要处理多少行。
    • 如果这是用 Sql 而不是 Linq 编写的,您还会采用相同的方法吗?我是 Linq 的忠实拥护者,但我注意到一个巨大的缺点是混合服务器和客户端处理很容易导致效率低下,如果编写存储过程就不会出现这种情况
    猜你喜欢
    • 2021-11-07
    • 1970-01-01
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2013-11-22
    相关资源
    最近更新 更多