【问题标题】:Is the Entity Framework unable to use non-entity classes in a query?实体框架是否无法在查询中使用非实体类?
【发布时间】:2010-12-07 17:25:58
【问题描述】:

我正在尝试确定我是否做错了什么,或者实体框架是否不适合这样做。我想执行 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 错误 - Entity Framework 似乎不喜欢在 LINQ 语句中构造非实体类,即使它不涉及任何数据库端逻辑。

我知道更改跟踪实体类被使用,但不可能将信息读取到任意类中吗?我不想为每个可能的读取场景构建实体和数据库视图,我不想通过管道发送一半的数据库(整个 Employee 或 Manager 实体)只​​是为了读取 name 属性之类的东西。

是否可以使用实体框架进行这种“懒惰但高效”的查询,或者实体框架只是没有考虑到它?在将项目从 Linq2SQL 转换为实体框架时,我已经遇到了许多问题,这真的会导致交易失败。

【问题讨论】:

    标签: .net-4.0 entity-framework-4


    【解决方案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();
    

    【讨论】:

    • 不幸的是,考虑了匿名类型项目,但在我的情况下,员工列表和枚举之间的区别是有意义的。然而,这仍然回答了我关于 EF 设计行为的真正问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    相关资源
    最近更新 更多