Ограничения объекта Entity Framework в совокупном запросе LINQ - PullRequest
2 голосов
/ 15 февраля 2010

У меня довольно сложный запрос, который я хотел бы получить, чтобы вернуть некоторые конкретные типы. В основном в отношении вычислений даты / времени или строковых значений, Entity Framework, похоже, плюет на пустышку, когда я пытаюсь сделать что-то большее, чем тип System.DateTime:

Указанный тип члена «Дата» не поддерживается в LINQ to Entities. Только инициализаторы, члены сущности и свойства навигации объекта поддерживается.

Запрос:

    // Here comes the aggregate query.
    object summary = from te in ctx.TimeEntries
                     where te.StartTime >= startofweek
                     && te.UserName == User.Identity.Name
                     group te by te.StartTime.Day into Groups
                     select new
                     {
                         Key = Groups.Key,
                         Count = Groups.Count(),
                         //Total = Groups.Sum(n => (double)((n.EndTime ?? DateTime.Now) - n.StartTime).TotalMinutes / 60),
                         Tasks = from t in Groups
                                 orderby t.StartTime descending
                                 select new
                                 {
                                     Name = t.Task.TaskName,
                                     Project = t.Task.Batch.Project.ProjectName,
                                     Batch = t.Task.Batch.BatchName,
                                     //Minutes = ((t.EndTime ?? DateTime.Now) - t.StartTime).Minutes,
                                     Start = t.StartTime.Date,
                                     Stop = t.EndTime,
                                     Description = t.Notes,
                                     Breaks = t.BreakFor ?? 0
                                 }
                     };

В приведенном выше запросе свойство «Пуск» завершится ошибкой с вышеупомянутой ошибкой. Однако, если у меня просто будет «Start = t.StartTime», все будет хорошо. Аналогично, закомментированное значение для «Минут» также вызовет проблемы.

Предложения приветствуются!

1 Ответ

3 голосов
/ 15 февраля 2010

Вы можете использовать только поддерживаемые элементы в запросах L2E, и Date не является одним из них .

Один из обходных путей - разбить ваш единственный запрос L2E на один запрос L2E, за которым следует один запрос LINQ to Objects:

var q = from e in Context.Entities
        select new
        {
            Id = e.Id,
            DateTime = e.DateTime
        };

var r = from e in q.AsEnumerable()
        select new
        {
            Id = e.Id,
            Date = e.DateTime.Date
        };
...