要选择所有有效的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
}
(Factory
是int
)
当我运行此代码时,我在foreach
行上收到了这个神秘错误:
无法创建类型为'System.Collections.Generic.IEnumerable`1'的常量值。在此上下文中仅支持原始类型(例如Int32,String和Guid')。
奇怪的是,我可以分别枚举allSchedulesOnALine
和allSchedulesUnscheduled
。更奇怪的是,如果我重新订购联盟:
IEnumerable<Scheduling> allSchedules = allSchedulesOnALine.Union(allSchedulesUnscheduled);
一切正常!
有谁知道为什么会这样?我错过了一些关键的东西,还是这个错误?
我应该提到我正在使用Entity Framework 3.5。 EF4目前不是我们的选择 - 它超出了我的控制范围:\
答案 0 :(得分:12)
您正在使用“重新排序”调用两种不同的方法。
您不会显示allSchedulesOnALine
或allSchedulesUnscheduled
的类型,但我认为allSchedulesOnALine
的类型为IEnumerable<Schedule>
而allSchedulesUnscheduled
属于IQueryable<Schedule>
类型IEnumerable<Schedule>
。
因此,当您调用Queryable.Union时,您要求EF将表达式转换为SQL。但是您传递的参数的类型为{{1}},并且无法将其转换为查询。
另一方面,当你调用Enumerable.Union时,你要求LINQ to Objects在内存中完成所有操作,这样可以正常工作,虽然可能更慢。
所以行为不同的原因是你要调用两个完全不同的方法,这些方法做了不同的事情,但碰巧有相同的名字。不,这不是一个错误。