Вопрос по linq, c#, timezone, .net, group-by – .NET LINQ для групп лиц по дате (дню)

13

У меня есть та же проблема, размещенная здесь: 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 бросит исключение.

ИМО, иногда самый простой способ просто написать sproc. Вам решать, когда вы достигнете этой точки. Kenneth Ito
Использование четырех EntityFunctions для одной задачи, например, overkill. Конечно, должен быть более легкий путь ... Zeezer
Не обязательно. Помните, что Linq to Entities должен конвертировать C # в SQL, это означает, что у него много ограничений на то, что вы можете с ним сделать, потому что нет SQL, поддерживающего эту операцию. EntityFunctions специально предназначены для борьбы с этими ограничениями, поэтому вы должны использовать их, если хотите, чтобы они делали. Erik Funkenbusch
Уродливый код не обязательно неэффективный код. Erik Funkenbusch
да, но такая простая операция должна уметь писать проще? Zeezer

Ваш Ответ

1   ответ
0

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

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

Похожие вопросы