实体框架 - 联盟导致"无法创建类型的常量值..."

Blu*_*eft 9 linq-to-entities entity-framework

要选择所有Scheduling活动的,我有以下代码:

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
}
Run Code Online (Sandbox Code Playgroud)

(Factoryint)

当我运行此代码时,我得到了这个神秘的错误foreach:

无法创建类型为'System.Collections.Generic.IEnumerable`1'的常量值.在此上下文中仅支持原始类型(例如Int32,String和Guid').

奇怪的是,我可以枚举都allSchedulesOnALineallSchedulesUnscheduled独立.更奇怪的是,如果我重新订购联盟:

IEnumerable<Scheduling> allSchedules = allSchedulesOnALine.Union(allSchedulesUnscheduled);
Run Code Online (Sandbox Code Playgroud)

它工作正常!

有谁知道为什么会这样?我错过了一些关键的东西,还是这个错误?

我应该提到我正在使用Entity Framework 3.5.EF4目前不是我们的选择 - 它超出了我的控制范围:\

Cra*_*ntz 12

您正在使用"重新排序"调用两种不同的方法.

你没有显示allSchedulesOnALine或的类型allSchedulesUnscheduled,但我打赌allSchedulesOnALine是类型IEnumerable<Schedule>allSchedulesUnscheduled类型IQueryable<Schedule>.

因此,当您调用Queryable.Union时,您要求EF将表达式转换为SQL.但是你传递的参数是类型的IEnumerable<Schedule>,它无法将其转换为查询.

另一方面,当你调用Enumerable.Union时,你要求LINQ to Objects在内存中执行整个操作,这样可以正常工作,尽管可能更慢.

所以行为不同的原因是你要调用两个完全不同的方法,这些方法做了不同的事情,但碰巧有相同的名字.不,这不是一个错误.