Entity Framework - Union вызывает «Невозможно создать постоянное значение типа ..» - PullRequest
9 голосов
/ 11 мая 2011

Чтобы выбрать все Scheduling s, которые активны, у меня есть следующий код:

var allSchedulesOnALine = CurrentUser.Lines.SelectMany(o => o.Scheduling).Where(o => o.Active);
var allSchedulesUnscheduled = Entities.SchedulingSet
    .Where(o => o.Line == null && o.Site.Id == CurrentUser.Site.Id &&
           o.Factory == CurrentUser.Factory && o.Active);

IEnumerable<Scheduling> allSchedules = allSchedulesUnscheduled.Union(allSchedulesOnALine);
foreach(Scheduling schedule in allSchedules.OrderBy(o => o.Ordering))
{
    //Do Stuff
}

(Factory является int)

Когда я запускаю этот код, я получаю эту загадочную ошибку в строке foreach:

Невозможно создать постоянное значение типа 'System.Collections.Generic.IEnumerable`1'. В этом контексте поддерживаются только примитивные типы (такие как Int32, String и Guid).

Как ни странно, я могу перечислить как allSchedulesOnALine, так и allSchedulesUnscheduled по отдельности. Даже страннее, если я переупорядочу профсоюз:

IEnumerable<Scheduling> allSchedules = allSchedulesOnALine.Union(allSchedulesUnscheduled);

Работает отлично!

Кто-нибудь знает, почему это произойдет? Я что-то упустил, или это ошибка?

Следует отметить, что я использую Entity Framework 3.5. EF4 для нас сейчас не вариант - он вне моего контроля: \

1 Ответ

12 голосов
/ 11 мая 2011

Вы вызываете два разных метода с вашим "переупорядочением".

Вы не показываете типы allSchedulesOnALine или allSchedulesUnscheduled, но я держу пари, что allSchedulesOnALine имеет тип IEnumerable<Schedule>, а allSchedulesUnscheduled имеет тип IQueryable<Schedule>.

Поэтому, когда вы вызываете Queryable.Union , вы просите EF перевести выражение в SQL.Но передаваемый аргумент имеет тип IEnumerable<Schedule>, и он не может преобразовать это в запрос.

С другой стороны, когда вы вызываете Enumerable.Union , вы просите LINQ to Objects сделать все это в памяти, что работает нормально, хотя, возможно, и медленнее.

Таким образом, причина в том, что поведение отличается тем, что вы вызываете два совершенно разных метода,которые делают разные вещи, но имеют одно и то же имя.Нет, это не ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...