【问题标题】:IEnumerable<> to ObjectSet<>, reason: INCLUDEIEnumerable<> 到 ObjectSet<>,原因:INCLUDE
【发布时间】:2012-08-27 13:23:32
【问题描述】:

我正在使用 Entity Framework 4.1 开发 MVC3 应用程序。我进行了 LINQ 查询,并将其返回为 IEnumerable&lt;T&gt;。但是,在控制器中,我必须使用Include(other entity),就像在ObjectSet 中一样,所以我可以在视图中显示其他实体值(与我正在查询的实体值相关联)。我尝试了从IEnumerable&lt;T&gt;ObjectSet&lt;T&gt; 的显式转换,但它抛出了异常。有什么方法可以从IEnumerable 获取ObjectSet,或者在IEnumerable 中包含实体?
提前致谢。

【问题讨论】:

    标签: .net entity-framework linq-to-entities entity-framework-4.1 ienumerable


    【解决方案1】:

    如果您的上下文仍然存在(如果您还没有离开使用)并且如果您还没有完成.ToList(),您应该可以转换为ObjectQuery&lt;T&gt;

    更安全的做法是在IQueryable&lt;T&gt; 上使用扩展方法,该方法检查可查询是否为ObjectQuery&lt;T&gt;,如果是,则转换为ObjectQuery&lt;T&gt; 并返回结果。Include() 否则返回输入查询。

    【讨论】:

    • 对此进行扩展,您可以返回您使用 IEnumerable 是否有特殊原因?如果您将 IQueryable 返回给您的控制器,它可以使用 IQueryable 包含
    • 如果我使用 IQueryable,我会得到“无法在 LINQ to Entities 查询中构造实体或复杂类型。”
    【解决方案2】:

    一旦将其转换为 IEnumerable,它就会与数据源断开连接。

    当 DAL 仍然是 IQueryable 或 IObjectQuery 时,您应该在 DAL 中包含相关实体,然后将完整结果作为 IEnumerable 返回。

    否则,您将对 DB 造成额外的打击。

    【讨论】:

    • 您是否看到实体在离开 Dal 之前已被填充,它们是否在转移到控制器时丢失了?
    • 当我直接在 ObjectSet 上使用查询时,即使没有包含,它也可以工作,我得到了所有字段。但是当我在上一句中提到的查询上使用查询时,它没有。当我在 IEnumerable 上使用查询时它丢失了(作为查询的结果)......
    • 我不会尝试在 IEnumerable 上使用包含,而是在对象集的源中使用并返回可供使用的实体。如果您需要访问实体的其他属性(例如导航属性),也许将这些属性放入自己的函数中并使用自己的视图来管理视图复杂性等可能会更谨慎。
    猜你喜欢
    • 2013-04-09
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多