2010-12-07 65 views
1

我试图确定如果我做错了什么,或者如果实体框架只是无意这样做。我想执行一个LINQ样式查询来填充一个对象,包括子元素的列表。在Linq2SQL中,这是有效的,并被转换为一个高效的SQL查询,其结果填充新列表。实体框架无法在查询中使用非实体类吗?

class ReportItem 
{ 
    string Manager; /* ... */ 
    List<string> Employees; /* ... */ 
} 

var report = (from manager in entities.Managers 
       select new ReportItem() 
       { 
        Manager = manager.Name, 
        Employees = manager.Employees.Select(e => e.Name).ToList() 
       }).ToList(); 

实体框架雇员线会导致method cannot be translated into a store expression错误 - 实体框架似乎并不喜欢构建LINQ语句中的非实体类,即使它不涉及任何数据库方面的逻辑。

据我所知,对于变更跟踪实体类都使用了,但是不可能将读取信息变成任意类吗?我不想为每个可能的读取场景构造实体和数据库视图,并且我不想在管道(整个Employee或Manager实体)上发送数据库的一半,只是为了读取名称属性等内容。

是否有可能做这种“懒惰而高效的”查询的实体框架,或实体框架只是没有考虑到与它建立?我已经遇到了将一个项目从Linq2SQL转换为实体框架的许多问题,这可能真的会导致交易失败。

回答

1

LINQ到实体只支持参数构造函数和初始化器。
更具体地,通过设计,LINQ到实体需要整个LINQ查询表达式中被翻译成一个服务器查询。只有少数不相关的子表达式(在不依赖于来自服务器的结果的查询表达式)在客户端上评估的查询翻译前。没有已知的翻译任意方法调用,并在你的情况参数初始化,是支持。

这就是说,你正在寻找可能是由匿名型投影轻松地完成了什么:

var report = (from manager in entities.Managers 
       select new 
       { 
        Manager = manager.Name, 
        Employees = manager.Employees.Select(e => e.Name) 
       }) 
       .ToList(); 
+0

不幸的是匿名类型的项目被认为是,但对我来说员工和枚举的列表之间的区别是有意义的。然而,这仍然回答了我关于EF设计行为的真正问题。谢谢 – David 2010-12-08 17:50:54