none
Linq 如何触发实体关联对象数据封装 RRS feed

  • 问题

  • 在分层结构里面,我们通常是用Linq查询一个实体,然后ToList到一个Linq的Model, 然后将这个Model给页面去用。
    在页面也很方便使用 例如 Product.Category.Name 的方式获取实体Product关联的Category的名称。
    如果不使用显式关闭连接,就不会出问题,但是,我们在数据层里面一旦使用了 Using() 作用域,就是显式关闭使用的资源,页面就会报错,说对象已经释放,不能取到Product.Category.Name ,可以看到,Product.Category.Name 是后期才进行查询获取的,然后我就用了一个笨方法,在DAL里面先遍历一遍Product里面的Category,
    这样,页面就不会报错了,因为遍历过,Category它就会封装到对象Product里面。

    但这种办法实在太笨,有没有更好的办法呢? 或者Linq有没有什么设置可以单独强制这个执行呢?

    这些问题不知道有没哪位碰到过,交流一下。。。。
    2010年1月29日 9:00

答案

  • 你好 Ocean,

    你可以用DataContext.LoadOptions来实现 Include 功能

               List<Product> productlist;
                using (var northwindDB = new DataClasses1DataContext())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Product>(p => p.Category);
                    northwindDB.LoadOptions = options;

                    productlist = northwindDB.Products.ToList();
                }

    文章来源在这里
    http://www.singingeels.com/Blogs/Nullable/2008/10/27/EntityFramework_Include_Equivalent_in_LINQ_to_SQL.aspx   


    Mog Liang
    • 已标记为答案 Mog Liang 2010年2月5日 6:18
    2010年2月5日 3:48

全部回复

  • 在分层结构里面,我们通常是用Linq查询一个实体,然后ToList到一个Linq的Model, 然后将这个Model给页面去用。
    在页面也很方便使用 例如 Product.Category.Name 的方式获取实体Product关联的Category的名称。
    如果不使用显式关闭连接,就不会出问题,但是,我们在数据层里面一旦使用了 Using() 作用域,就是显式关闭使用的资源,页面就会报错,说对象已经释放,不能取到Product.Category.Name ,可以看到,Product.Category.Name 是后期才进行查询获取的,然后我就用了一个笨方法,在DAL里面先遍历一遍Product里面的Category,
    这样,页面就不会报错了,因为遍历过,Category它就会封装到对象Product里面。

    但这种办法实在太笨,有没有更好的办法呢? 或者Linq有没有什么设置可以单独强制这个执行呢?

    这些问题不知道有没哪位碰到过,交流一下。。。。

    有些人说,不用写Using来释放Datacontext资源,说系统会自动回收,这样当然也可以用,但是太依赖自动回收,性能可能会很差。而且微软能出Using这个语句,肯定有它的道理。

    关于这方面的资料,网上搜的都是有问题没答案,这里微软的专家能否解答一下。 这可是微软的论坛哦。。。。。
    难道当时设计Linq的时候没考虑这个问题?

    请问,有Linq专家在吗!!!!!
    2010年2月3日 4:13
  • 你好 Ocean,

    你可以用DataContext.LoadOptions来实现 Include 功能

               List<Product> productlist;
                using (var northwindDB = new DataClasses1DataContext())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Product>(p => p.Category);
                    northwindDB.LoadOptions = options;

                    productlist = northwindDB.Products.ToList();
                }

    文章来源在这里
    http://www.singingeels.com/Blogs/Nullable/2008/10/27/EntityFramework_Include_Equivalent_in_LINQ_to_SQL.aspx   


    Mog Liang
    • 已标记为答案 Mog Liang 2010年2月5日 6:18
    2010年2月5日 3:48
  • 如果是web开发的话,你也可以把data context放到当前的http context里面去。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年2月7日 16:56
    版主
  • 你好 Ocean,

    你可以用DataContext.LoadOptions来实现 Include 功能

               List<Product> productlist;
                using (var northwindDB = new DataClasses1DataContext())
                {
                    DataLoadOptions options = new DataLoadOptions();
                    options.LoadWith<Product>(p => p.Category);
                    northwindDB.LoadOptions = options;

                    productlist = northwindDB.Products.ToList();
                }

    文章来源在这里
    http://www.singingeels.com/Blogs/Nullable/2008/10/27/EntityFramework_Include_Equivalent_in_LINQ_to_SQL.aspx   


    Mog Liang

    hehe, 我发现直接取一次Category对象的写法还更简单, 
    如下
      var getProduct = db.Products.ToList();
      var getCategory = getProduct.Select(p=>p.Category).ToList();

    我想作用也是一致的。
    2010年2月12日 11:43
  • 如果是web开发的话,你也可以把data context放到当前的http context里面去。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP

    因为我是分层的结构,data context 不可能写在http context这一层里面。。。
    是吧?
    2010年2月12日 11:45
  • 我用的是提供者模式,所以运行的时候是根据config来决定是用基于http context,transaction scope还是别的位置的data context提供者,数据层调用的只是一个提供者接口而已.

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年2月12日 13:03
    版主