Entity Framework-Union вызывает " невозможно создать постоянное значение типа.."

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

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.Коллекции.Родовой.IEnumerable '1'. Только примитивные типы ('такие как int32, String и GUID') поддерживаются в этом контексте.

как ни странно, я могу перечислите оба allSchedulesOnALine и allSchedulesUnscheduled отдельно. Еще более странно, если я переупорядочу Союз:

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

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

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

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

1 ответов


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

вы не показать вида allSchedulesOnALine или allSchedulesUnscheduled, но я ставлю allSchedulesOnALine типа IEnumerable<Schedule> и allSchedulesUnscheduled типа IQueryable<Schedule>.

поэтому, когда вы называете Queryable.Союз, вы просите EF перевести выражение в SQL. Но ... --14-->аргумент вы проходите типа IEnumerable<Schedule>, и он не может перевести это в запросе.

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

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