2010-10-04 5 views
1

Мне нужно перевести поле с UTC по местному времени в запросе LINQ to Entities. Но он не распознает метод «System.DateTime ToLocalTime», который я должен был использовать.UTC to local time using Linq to Entities

Мой запрос был таким образом:

Выберите запросы, для которых не существует какой-либо другой запрос в тот же день в местной еще не решен. Учитывая, что IncommingDateTime хранится в UTC, это запрос.

from r in Requests 
where Request.Count(x => x.IncommingDateTime.ToLocalTime().Date == r.IncommingDateTime.ToLocalTime().Date 
&& x.Resolved == false) = 0 
select r 

Буду признателен за любую помощь.

ответ

1

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

Отметьте, что DateTime.Day представляет только день месяца - вы хотите, чтобы 10 июня и 10 июля считались в тот же день?

Если вы можете решить, в каком часовом поясе вы действительно заинтересованы, это может предложить потенциальное решение, хотя я бы не хотел его гарантировать. Возможно, это один из тех случаев, когда фактически имеет смысл хранить локальную дату и время, а также часовой пояс, а не дату/время UTC. (Это целесообразно, если локальная дата/время на самом деле важнее моментального представления по сравнению с другими значениями.)

+0

Спасибо, Джон. Вы правы относительно свойства DateTime.Day. Я ожидаю, что на данный момент сервер будет использовать свое местное время (я изменю это позже, чтобы использовать определенный часовой пояс). И, что касается базы данных, у меня нет выбора в хранении в UTC. –

+0

@ViBela: Когда вы говорите «сервер» - есть два задействованных сервера: тот, который использует код .NET и базу данных. На данный момент они могут быть одной и той же коробкой, но вы должны понять в своем уме, что * логический *, о котором вы говорите :) –

1

Чтобы иметь возможность использовать функции, которые не переходят на SQL, вам необходимо материализовать таблицу.

var materializedRequests = Requests.Where(x => !x.Resolved).ToList(); //Materialize list with a ToList call 

materializedRequests 
    .Where(x => 
     !materializedRequests.Any(y => 
      y.IncommingDateTime.ToLocalTime().Day == x.IncommingDateTime.ToLocalTime().Day 
     ) 
    ) 

Тогда вы можете использовать практически любые функции, которые вы хотите. Однако материализация списка - ОЧЕНЬ дорогой звонок. Попробуйте отфильтровать список столько, сколько вы можете, прежде чем материализовать его.