【发布时间】:2011-05-29 01:32:21
【问题描述】:
我知道 Entity Framework 存在一些 LINQ 支持问题(至少与其前身 LINQ to SQL 相比)......而且通常我能够找到一种创造性的方式来重组我的 LINQ 查询,以便它得到 EF 的支持并且不会抛出
"Unable to create a constant value of type ..."
但这一次我遇到了麻烦。像往常一样,这个问题与复杂的连接有关。这次需要对我正在处理的一些遗留数据进行建模。
我有一个办公室查询(一个简单的 POCO)
public IQueryable<Office> Offices
{
get
{
IQueryable<Office> query =
from pn in _context.Locations
where pn.Type == "Y"
select new Office
{
Id = pn.Id + 1000,
Name = pn.Name,
};
query = query.Union(
from r in _context.Resources
where r.ResourceType == "L"
select new Office
{
Id = r.ResourceId,
Name = r.ResourceName,
});
return query;
}
}
然后我有其他东西,上面有 Office 属性。
public IQueryable<ScheduleEntry> ScheduleEntries
{
get
{
return
from pc in _context.CalendarEntries
join o in this.Offices on pc.LocationId
equals o.Id into offices
from office in offices.DefaultIfEmpty()
let mainOffice = this.Offices.First()
select new ScheduleEntry
{
Id = pc.CalendarId,
StartDateTime = pc.StartDateTime ?? DateTime.MinValue,
EndDateTime = pc.EndDateTime ?? DateTime.MinValue,
Office = pc.LocationId == 0 ? mainOffice : office,
};
}
}
请注意,告诉我将其设为可枚举会破坏目的......所以请不要这样做。
所以....做CalendarEntries.ToArray() 抛出"Unable to create a constant value of type Office"...
具体的问题是let mainOffice = Offices.First()。如果我删除该逻辑,则查询工作正常。知道如何使用 Entity Framework 进行这项工作吗?
谢谢。
【问题讨论】:
-
哇。 “糟糕的 LINQ 支持?”我认为你应该编辑掉这个问题的情绪或风险,因为这个问题是主观的和有争议的。坚持到底。span>
-
EF 没有较差的 linq 支持。它不依赖于存储。 Linq to sql 基本上是 SQL Server 代码生成,而 EF 是真正的 ORM。这意味着计算的属性只有在任何数据存储(不仅仅是 SQL Server)中都可以使用的情况下才有效。这不是糟糕的支持,只是通用数据存储支持。
-
这听起来更像是威胁而不是建议。不过很公平,我在寻求帮助,而不是威胁。
-
@Gats:我不认为使用产品功能是对其失败的充分防御。前进一步后退两步并不是成功的定义。
-
@Gats:我完全了解 IQueryProvider 的工作方式。说这是因为数据存储的工作方式不准确/不正确。完全有可能以多种方式执行上述类型的查询,所有数据存储独立。 FRAMEWORK 是无法做到的。如果这是一个权衡,那么权衡是 EF 团队决定他们无法弄清楚如何或没有足够的时间来做到这一点。考虑到 EF 的前身可以做到这一点没有问题,我认为这是一个失败。
标签: .net linq entity-framework entity-framework-4