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

时间:2011-05-10 21:42:48

标签: entity-framework linq-to-entities

要选择所有有效的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
}

Factoryint

当我运行此代码时,我在foreach行上收到了这个神秘错误:

  

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

奇怪的是,我可以分别枚举allSchedulesOnALineallSchedulesUnscheduled。更奇怪的是,如果我重新订购联盟:

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

一切正常!

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

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

1 个答案:

答案 0 :(得分:12)

您正在使用“重新排序”调用两种不同的方法。

您不会显示allSchedulesOnALineallSchedulesUnscheduled的类型,但我认为allSchedulesOnALine的类型为IEnumerable<Schedule>allSchedulesUnscheduled属于IQueryable<Schedule>类型IEnumerable<Schedule>

因此,当您调用Queryable.Union时,您要求EF将表达式转换为SQL。但是您传递的参数的类型为{{1}},并且无法将其转换为查询。

另一方面,当你调用Enumerable.Union时,你要求LINQ to Objects在内存中完成所有操作,这样可以正常工作,虽然可能更慢。

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