Entity Framework-Union вызывает " невозможно создать постоянное значение типа.."
выделить все 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.Коллекции.Родовой.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 сделать все это в памяти, что отлично работает, хотя, возможно, и медленнее.
Итак, причина, по которой поведение отличается, заключается в том, что вы вызываете два совершенно разных метода, которые делают разные вещи, но имеют одно и то же имя. Нет, это не жук.