【问题标题】:Eager-loading & LINQ to EntitiesEager-loading 和 LINQ to Entity
【发布时间】:2009-03-30 09:56:57
【问题描述】:

据我所知,LINQ to entity 鼓励使用 Load()Include() 进行预加载。但是,我想知道在多层应用程序中应该在哪里进行预加载?

数据访问层(封装实体实例的存储库类)具有通用Item GetItem(int id)函数是否正确,并且在业务逻辑层中这样做

Item item = dbRepository.GetItem(itemId);
if (!item.itemDetails.IsLoaded)
 item.itemDetails.Load()

或者存储库类应该有不同的显式函数来加载不同的外部关系,因此返回预加载关系的项目?

非常感谢!

编辑: 示例 - http://www.asp.net/learn/mvc/tutorial-29-cs.aspx

public Contact GetContact(int id)

此函数返回Contact 实体类型。但是,取决于业务逻辑的需要,我们可能想要Load()Include() 不同的外关系Contact 实体。这个要求是否意味着我们需要更多重载的GetContact() 方法,其参数指示要加载哪些关系,或者只是在业务逻辑中执行Load()

【问题讨论】:

    标签: linq-to-entities


    【解决方案1】:

    在大多数情况下,我都不做任何一个。相反,我使用 LINQ 将我的实体类型映射到表示模型类型。在这种情况下,您根本不必考虑加载。例如:

    var presentationModel = (from entity in Repository.Entities
                             select new PresentationEntity ()
                             {
                                 Prop = entity.Prop,
                                 ChildProp = entity.Child.Prop
                             }).First();
    

    请注意,我不必考虑加载 Child。当您投影到不同的类型时,LINQ to entity 会为您执行此操作。

    【讨论】:

    • 感谢您的回答。这种逻辑应该发生在哪里?如果我们在 Model 层进行映射(我假设 MVC),那么我们不是将 Model 类与 Presentation 模型混为一谈,因此数据访问层需要知道表示模型吗?
    • 从存储库类型映射到表示模型类型(反之亦然)应该在控制器中。
    • 这意味着 linq 查询也将在控制器中? (对不起,我对此很陌生)
    • 是的。只要您不重新实现应该在存储库中的功能,在控制器中使用 LINQ 就没有错。 LINQ 是一种用于将一种类型的列表转换为另一种类型的列表的系统。该功能在很多地方都很有用。
    • 嗯,我明白你的意思了,但是我们这里可能对 Repository 有不同的定义。 asp.net/learn/mvc/tutorial-29-cs.aspx 上的示例如何将存储库模式与 MVC 框架一起使用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    相关资源
    最近更新 更多