我正在尝试确定我是否做错了什么,或者实体框架是否意味着这样做。我想执行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();
使用Entity Framework,Employees行将导致method cannot be translated into a store expression
错误 - 实体框架似乎不喜欢在LINQ语句中构造非实体类,即使它不涉及任何数据库端逻辑。
我理解,对于更改跟踪实体类的使用,但是读取信息到任意类是不可能的?我不想为每个可能的读取场景构建实体和数据库视图,并且我不希望跨管道(整个Employee或Manager实体)发送一半数据库只是为了读取诸如name属性之类的东西。
是否可以使用实体框架执行此类“懒惰但高效”的查询,或者实体框架是否仅仅是为此而构建的?我已经遇到了一些将项目从Linq2SQL转换为实体框架的问题,这可能真的会破坏这笔交易。
答案 0 :(得分:1)
LINQ to Entities仅支持无参数构造函数和初始化程序。
更具体地说,LINQ to Entities需要将整个LINQ查询表达式转换为服务器查询。在翻译查询之前,在客户端上仅评估少数不相关的子表达式(查询中不依赖于服务器结果的表达式)。没有已知翻译的任意方法调用以及您的情况下的参数化初始值设定项都不受 支持。
也就是说,您正在寻找的内容可以通过匿名类型投影轻松完成:
var report = (from manager in entities.Managers
select new
{
Manager = manager.Name,
Employees = manager.Employees.Select(e => e.Name)
})
.ToList();