2013-06-12 5 views
0

У меня есть метод, который возвращает все события, основанные на EventTypeID:Учитывая DateTime, как вызвать .ToUniversalTime при использовании LINQ to NHibernate?

public IList<Event> FindAll(int eventTypeId, DateTime? modifiedSince) 
     { 
      IQueryable<Event> query = this.SessionFactory.Session.Query<Event>().Where(e => e.EventType.Id == eventTypeId); 

      if (modifiedSince.HasValue) 
      { 
       // .ToUniversalTime() call throws NotSupportedException 
       query = query.Where(et => et.ModifiedDate.ToUniversalTime() >= modifiedSince.Value); 
      } 

      return query.ToList(); 
     } 

Как вызвать метод .ToUniversalTime() для каждой записи, как показано выше?

Я в идеале не хочу звонить .ToList() сначала, затем фильтр.

Если он вообще не поддерживается, как можно расширить LINQ to NHibernate для поддержки этой конкретной функции?

+0

Вместо того, чтобы пытаться изменить каждую строку таблицы ToUniversalTime, вы могли бы изменить измененные. Так как это время, которое правильно относится к записям базы данных? –

ответ

1

Это может быть несколько сложно решить, потому что я ожидаю, что строки данных, которые вы извлекаете, включают время в разных часовых поясах.

Эта проблема возникает из-за того, что ваш запрос et.ModifiedDate.ToUniversalTime() передается в запросе, а цель запроса не поддерживает эту операцию (поэтому вы видите это во время выполнения, а не во время компиляции).

Чтобы обойти это, обычно выполняется вычисление, требуемое вне блока запроса, и передает его этому значению.

Вам нужно будет рассмотреть другой способ проведения теста.

+0

Спасибо, но я не могу рассчитать вне блока запроса, расчет должен выполняться для каждой строки в таблице, участвующей в этом запросе. –

+0

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

+1

Не работает ли этот подход? http://stackoverflow.com/questions/10604941/nhibernate-linq-provider-datediff –

Смежные вопросы