C# 如何处理Linq查询中的日期?

C# 如何处理Linq查询中的日期?,c#,linq,date,C#,Linq,Date,我收到一个不支持的异常: 方法“System.TimeSpan FromMinutes(Double)”不支持转换为SQL。 运行此查询时: var searchSchedules = from searchSchedule in db.SearchSchedules where searchSchedule.Active.Value && searchSchedule.LastChecked.Value < Da

我收到一个
不支持的异常

方法“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;
var搜索时间表=
从数据库中的searchSchedule.SearchSchedules
其中searchSchedule.Active.Value&&
searchSchedule.LastChecked.Value<
DateTime.UtcNow.Subtract(TimeSpan.FromMinutes(
搜索时间表。检查频率(分钟)&&
searchSchedule.PublishingConfigurationId==pubConfig.Id
选择搜索时间表;

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

一种方法是将此查询分为两部分。一个片段针对数据库执行,第二个片段针对客户端执行,如下所示:

// 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))
//此操作针对数据库执行
var query1=从数据库中的searchSchedule.SearchSchedules
其中searchSchedule.Active.Value
&&searchSchedule.PublishingConfigurationId==pubConfig.Id
选择搜索时间表;
//这在客户机上执行
变量query2=来自query1的IEnumerable()
其中query1.LastChecked.Value
当我想在SQL Server不知道如何处理的查询中包含一个函数时,我通常会执行这样的查询。在第二个查询中,将query1转换为IEnumerable将强制它在客户端上针对.NET framework而不是数据库执行


您需要确定在客户端上可能需要处理多少行,以确定此操作的效率。

如果您只是尝试检查自上次检查以来是否已过指定的分钟数,您可以这样重写:

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;

在处理大型数据集时,这种方法会导致非常低效的情况,因为数据库可以简单地使用一个非常快速的索引列,客户端将遍历返回的整个IEnumerable。我也使用这种方法,然而,我们经常担心不可预见的数据量,这些数据可能被带回客户机,但却被where子句抛出。这当然是一种可能性。我只是把它作为一种选择。第一个查询上已经有两个筛选器。您需要确定客户端上可能需要处理多少行。如果这是用Sql而不是Linq编写的,您还会采用相同的方法吗?我是Linq的忠实拥护者,但我注意到一个巨大的缺点是,服务器和客户端处理很容易混合,这会导致效率低下,如果编写一个存储过程,这是不会发生的。谢谢,我最终使用了您的解决方案。