积极答复者
Linq 如何触发实体关联对象数据封装

问题
-
在分层结构里面,我们通常是用Linq查询一个实体,然后ToList到一个Linq的Model, 然后将这个Model给页面去用。
在页面也很方便使用 例如 Product.Category.Name 的方式获取实体Product关联的Category的名称。
如果不使用显式关闭连接,就不会出问题,但是,我们在数据层里面一旦使用了 Using() 作用域,就是显式关闭使用的资源,页面就会报错,说对象已经释放,不能取到Product.Category.Name ,可以看到,Product.Category.Name 是后期才进行查询获取的,然后我就用了一个笨方法,在DAL里面先遍历一遍Product里面的Category,
这样,页面就不会报错了,因为遍历过,Category它就会封装到对象Product里面。
但这种办法实在太笨,有没有更好的办法呢? 或者Linq有没有什么设置可以单独强制这个执行呢?
这些问题不知道有没哪位碰到过,交流一下。。。。
答案
-
你好 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
全部回复
-
在分层结构里面,我们通常是用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专家在吗!!!!! -
你好 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
-
你好 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();
我想作用也是一致的。 -