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)
(Factory是int)
当我运行此代码时,我得到了这个神秘的错误foreach:
无法创建类型为'System.Collections.Generic.IEnumerable`1'的常量值.在此上下文中仅支持原始类型(例如Int32,String和Guid').
奇怪的是,我可以枚举都allSchedulesOnALine和allSchedulesUnscheduled独立.更奇怪的是,如果我重新订购联盟:
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在内存中执行整个操作,这样可以正常工作,尽管可能更慢.
所以行为不同的原因是你要调用两个完全不同的方法,这些方法做了不同的事情,但碰巧有相同的名字.不,这不是一个错误.
| 归档时间: |
|
| 查看次数: |
2459 次 |
| 最近记录: |