Nano Hash - криптовалюты, майнинг, программирование

Использование DateDiff в Entity Framework в базе данных SQL CE

У меня есть метод, который должен возвращать список анонимных объектов с таким вычисляемым столбцом:

        var tomorrow = DateTime.Today.AddDays(1);
        return from t in this.Events
                where (t.StartTime >= DateTime.Today && t.StartTime < tomorrow && t.EndTime.HasValue)
                select new
                {
                    Client = t.Activity.Project.Customer.Name,
                    Project = t.Activity.Project.Name,
                    Task = t.Activity.Task.Name,
                    Rate = t.Activity.Rate.Name,
                    StartTime = t.StartTime,
                    EndTime = t.EndTime.Value,
                    Hours = (System.Data.Objects.SqlClient.SqlFunctions.DateDiff("m", t.StartTime, t.EndTime.Value) / 60),
                    Description = t.Activity.Description
                };

К сожалению, я получаю следующую ошибку от функции DateDiff:

Указанный метод «System.Nullable1[System.Int32] DateDiff(System.String, System.Nullable1[System.DateTime], System.Nullable`1[System.DateTime])» для типа «System.Data.Objects.SqlClient.SqlFunctions» не может быть преобразован в LINQ to Entities. сохранить выражение.

Любые идеи, что я мог сделать неправильно здесь?

РЕДАКТИРОВАТЬ: я также попробовал класс EntityFunctions, упомянутый здесь , но это тоже не сработало.

Minutes = EntityFunctions.DiffMinutes(t.EndTime, t.StartTime),

Ответы:


1

[Редактировать]

Hours = (System.Data.Objects.SqlClient.SqlFunctions.DateDiff("mi", t.StartTime, t.EndTime.Value) / 60)

не поддерживается SQL CE.

Hours = ((TimeSpan)(t.EndTime.Value - t.StartTime)).TotalHours

Выдает исключение DbArithmeticExpression

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

var events = (from t in context.Events
    where (t.StartTime >= DateTime.Today && t.StartTime < tomorrow && t.EndTime.HasValue)
    select t).ToArray();

return from t in events
    select new
    {
         ...
         Hours = (t.EndTime.Value - t.StartTime).TotalHours
    };
30.12.2010
  • Это то, с чего я начал, и это не могло быть переведено. Поэтому я искал, и рекомендуемый подход заключался в использовании SqlFunctions. 30.12.2010
  • С этим кодом я получаю исключение: аргументы DbArithmeticExpression должны иметь числовой общий тип. 31.12.2010
  • TotalHours не определяется linq2EF, лучше просто иметь отредактированный ответ :) 31.12.2010
  • Я уже реализовал этот способ, но я приму это за правильность. 31.12.2010

  • 2

    Вы просите поставщика EF обрабатывать DATEDIFF в SQL, что, я думаю, невозможно в любой версии SQL. Используйте собственные функции DateTime:

    var tomorrow = DateTime.Today.AddDays(1);
            return from t in this.Events
                    where (t.StartTime >= DateTime.Today && t.StartTime < tomorrow && t.EndTime.HasValue)
                    select new
                    {
                        Client = t.Activity.Project.Customer.Name,
                        Project = t.Activity.Project.Name,
                        Task = t.Activity.Task.Name,
                        Rate = t.Activity.Rate.Name,
                        StartTime = t.StartTime,
                        EndTime = t.EndTime.Value,
                        Hours = t.EndTime.Value(t.StartTime.Subtract).Hours,
                        Description = t.Activity.Description
                    };
    
    30.12.2010
  • Привет Дэйв, Спасибо за ваш ответ. Я попробовал Hours = t.EndTime.Value.Subtract(t.StartTime) и получил сообщение об ошибке LINQ to Entities не распознает метод «System.TimeSpan Subtract(System.DateTime)», и этот метод не может быть преобразован в выражение хранилища. 30.12.2010
  • EF все еще пытается перевести его на T-SQL. Вам, вероятно, придется получить набор результатов без датиффа, а затем спроецировать его на новый. 31.12.2010

  • 3

    Две возможности, удалить Value из EndTime:

    Hours = (System.Data.Objects.SqlClient.SqlFunctions.DateDiff("m", t.StartTime, t.EndTime) / 60) 
    

    Или используйте DateDiffHour:

    Hours = (System.Data.Objects.SqlClient.SqlFunctions.DateDiffHour(t.StartTime, t.EndTime)
    
    30.12.2010
  • Привет Шахид! Спасибо за ваш ответ. К сожалению, первый вариант дает мне то же сообщение об ошибке. И второе, ну нет такого метода DateDiffHour. 30.12.2010
  • Справку по методу DateDiffHour можно найти здесь: msdn.microsoft.com/en-us /library/bb495790.aspx Но это может не поддерживаться платформой CE. В противном случае я бы предпочел обрабатывать даты в коде C #, а не в SQL, как упоминал @Steven Kimpe. 31.12.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..