【问题标题】:How to project a navigation property using Linq to Entities?如何使用 Linq to Entities 投影导航属性?
【发布时间】:2013-03-31 15:08:59
【问题描述】:

我首先使用代码构建了一个数据库。我发现使用投影到具体类型进行查询是迄今为止最快的方法,比使用Include 语句更快。但是我遇到了以下问题:

dim records=(From record in db.SomeDbSet
             Where record.UserID=userID
             Select New UserSpecificRecord With
             { .Name=record.User.Name
               .Tasks=record.Tasks
             }).ToList

在执行 .Tasks= 部分时,我得到不同的错误,从无效的强制转换异常到 Enity 框架不支持这种查询的消息,具体取决于集合的类型,我创建了 UserSpecificRecord 类的 Tasks 属性.

当我将代码更改为:

 Dim records= (From record in db.SomeDbSet
                 Where record.UserID=userID
                 Select New With
                 { .Name=record.User.Name
                   .Tasks=record.Tasks
                 }).ToList

   dim userRecords=(From record in records
                    Select New UserSpecificRecord With
                    { .Name=record.Name
                     .Tasks=record.Tasks
                     }).ToList

即:我投影到一个匿名类型,然后构建它所有工作的具体类型。不过,我非常希望能够直接投影到具体类型。能做到吗?

【问题讨论】:

    标签: entity-framework querying


    【解决方案1】:

    您不能投影到“实体”(您的 UserSpecificRecord 是否也已映射?从名称上看似乎如此)。
    这与“具体课程”无关。

    看到这个答案The entity cannot be constructed in a LINQ to Entities query

    【讨论】:

    • 'UserSpecifiedRecord' 不是实体,只是一个方便聚合我需要处理的数据的类。
    • 没有代码很难这样说。您能否发布您的缩小模型(涉及的实体),以便我可以运行 - 以及您的“具体”课程。而且我实际上怀疑它可能是完全不相关的(正如你提到的错误范围),并且与 EF 相关。顺便提一句。你使用代码优先还是数据库优先
    • 我想应该够清楚了:共有三个实体:Records、User 和Task,一个Record 有很多Tasks,一个User 有很多Records。 UserSpecificRecord 是一个 DTO。
    • 好的,感谢您帮我检查,我会进一步调查。
    • 感谢您与我合作。毕竟它确实奏效了。该问题与继承的实体和类型转换有关。此外,唯一可以直接投影的集合类型似乎是 IENumerable(Of TEntity)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2011-04-26
    相关资源
    最近更新 更多