Как бороться с датами в Linq Query? - PullRequest
2 голосов
/ 27 ноября 2010

Я получаю NotSupportedException:

Метод 'System.TimeSpan FromMinutes (Double)' не поддерживает перевод на SQL.

При запуске этогоquery:

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.Как я могу сделать эту работу?

Ответы [ 2 ]

4 голосов
/ 27 ноября 2010

Если вы просто пытаетесь проверить, прошло ли указанное количество минут с момента последней проверки, вы можете переписать это так:

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;
1 голос
/ 27 ноября 2010

Один из способов сделать это - разбить этот запрос на две части.Один фрагмент выполняется для базы данных, а второй выполняется на клиенте следующим образом:

// 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 Framework вместо вашей базы данных.

Вам нужно будет определить, сколько строк может потребоваться обработать вклиент, чтобы определить, насколько эффективно это может быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...