.NET LINQ для групп лиц по дате (дню)

У меня есть та же проблема, размещенная здесь: LINQ to Entities сбой группы с использованием .date

Тем не менее, ответ не на 100% правильный. Это работает во всех случаях, кроме случаев, когда используются разные часовые пояса. Когда используются разные часовые пояса, он также группируется по часовым поясам. Зачем? Мне удалось обойти это с помощью многих функций сущностей.

int localOffset= Convert.ToInt32(
    TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).TotalMinutes);

var results = (
    from perfEntry in db.entry
    where (....)
    select new { 
        perfEntry.Operation, perfEntry.Duration, 
        localTime = EntityFunctions.AddMinutes(perfEntry.Start, 
            localOffset - EntityFunctions.GetTotalOffsetMinutes(
                perfEntry.Start)) 
    }
).GroupBy(x => new { 
    Time = EntityFunctions.TruncateTime(
        EntityFunctions.CreateDateTime(x.localTime.Value.Year,
            x.localTime.Value.Month, x.localTime.Value.Day, 0, 0, 0)),
    x.Operation }
).OrderByDescending(a => a.Key).
Select(g => new {
    Time = g.Key.Time,
    ...
});

Есть ли кто-нибудь, кто знает, как сделать это правильно? Этот код настолько уродлив и, вероятно, очень неэффективен.

ОБНОВЛЕНИЕ (предупреждение):
Я также понял, что функция EntityFunctions.CreateDateTime страдает от ошибки. Это не совместимо с високосными годами, такими как этот год. 29 февраля 2012 бросит исключение.

 Zeezer14 июн. 2012 г., 08:09
да, но такая простая операция должна уметь писать проще?
 Kenneth Ito24 июн. 2012 г., 20:54
ИМО, иногда самый простой способ просто написать sproc. Вам решать, когда вы достигнете этой точки.
 Erik Funkenbusch14 июн. 2012 г., 22:05
Не обязательно. Помните, что Linq to Entities должен конвертировать C # в SQL, это означает, что у него много ограничений на то, что вы можете с ним сделать, потому что нет SQL, поддерживающего эту операцию. EntityFunctions специально предназначены для борьбы с этими ограничениями, поэтому вы должны использовать их, если хотите, чтобы они делали.
 Zeezer15 июн. 2012 г., 08:12
Использование четырех EntityFunctions для одной задачи, например, overkill. Конечно, должен быть более легкий путь ...
 Erik Funkenbusch13 июн. 2012 г., 16:26
Уродливый код не обязательно неэффективный код.

Ответы на вопрос(1)

Решение Вопроса

Вы можете использовать UTC DateTime и транслировать время после него.

 Zeezer16 июл. 2012 г., 14:34
Хорошо, эти швы будут лучшим решением, хотя я надеялся, что это можно решить без изменения базы данных. Есть ли функции sqlfunction, которые можно перевести на UTC?
 Zeezer13 июл. 2012 г., 11:11
Я имею дело с огромными таблицами и сложной статистикой. Получение всех данных в первую очередь будет влиять на производительность, которую я не хочу принимать.
 Zeezer13 июл. 2012 г., 08:44
Вы имеете в виду функцию DateTime ToUniversalTime ()? Это не работает в linq для сущностей. Вы можете использовать только несколько функций и свойств в linq для сущностей.
 13 июл. 2012 г., 10:05
LinqToEntity попытается преобразовать ваш запрос в SQL-запрос. Он не может перевести ToUniversalTime () на Sql. Я предлагаю вам сначала получить все данные (например, .ToList ()) и выполнить любые действия по сбору данных. В этом случае вы можете использовать функцию ToUTCTime () в запросе Linq.
 13 июл. 2012 г., 11:48
Хорошо. В случае, если вам нужно заставить работать некоторые sql и выровнять дату по UTC в SQL. Вы можете использовать вид для создания работы. Конечно, вы будете продолжать в том же духе. Кроме того, вы можете сократить время в представлении. Это будет намного быстрее, если вы будете использовать функции Dateadd и datediff.

Ваш ответ на вопрос