Использование DateDiff в Entity Framework для базы данных SQL CE - PullRequest
1 голос
/ 30 декабря 2010

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

        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.Nullable 1[System.Int32] DateDiff(System.String, System.Nullable 1 [System.DateTime], System.Nullable`1 [System.DateTime])' для типа 'System.Data.Objects.SqlClient.SqlFunctions' не может быть переведено в выражение LINQ to Entities: .

Есть идеи, что я мог бы сделать не так?

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

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

Ответы [ 3 ]

4 голосов
/ 30 декабря 2010

[Изменить]

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
    };
0 голосов
/ 30 декабря 2010

Две возможности, удалить значение из 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)
0 голосов
/ 30 декабря 2010

Вы просите провайдера 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
                };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...