LinqPad 5中如何仅获取主表Order记录而不加载关联的OrderLines数据
解决LinqPad 5中仅查询主表Order不加载关联OrderLines的问题
嘿,我完全懂你的困扰——手动列举所有字段实在太繁琐了,这里有几个更优雅的方法能帮你解决这个问题:
1. 手动实例化DataContext并使用AsNoTracking()
LinqPad的C#程序模式下,你可以直接创建数据上下文实例,通过AsNoTracking()避免自动加载关联数据:
- 先找到你的数据上下文类名(LinqPad连接数据库时会自动生成,比如数据库名为
OrderDB的话,上下文类就是OrderDB) - 用LinqPad内置的连接字符串实例化上下文,再执行查询:
var dc = new OrderDB(Util.Connection); // Util.Connection是LinqPad提供的当前连接字符串 var order = dc.Orders.AsNoTracking().Where(o => o.Id == 123).FirstOrDefault(); order.Dump();
AsNoTracking()会让EF不再跟踪实体,同时也不会自动加载关联的导航属性,这样查询出的Order就不会包含OrderLines数据。
2. 关闭上下文的延迟加载
如果你需要实体保持被上下文跟踪(方便后续修改),可以直接关闭延迟加载,这样即使Dump()遍历属性,也不会触发关联数据的加载:
var dc = new OrderDB(Util.Connection); dc.Configuration.LazyLoadingEnabled = false; // 关闭延迟加载 var order = dc.Orders.Where(o => o.Id == 123).FirstOrDefault(); order.Dump();
3. 限制Dump()的显示深度(快速临时方案)
如果只是不想在Dump结果里看到关联数据,不在乎查询时是否加载了它,可以给Dump()指定显示深度:
var order = Orders.Where(o => o.Id == 123).FirstOrDefault(); order.Dump(1); // 只显示一级属性,不会展开导航属性
这个方法操作简单,但要注意:关联数据其实还是被加载到内存了,只是没显示出来,适合快速查看主表数据的场景。
4. 利用智能提示快速投影到实体类型
如果需要返回强类型Order对象,又不想手动敲所有字段,可以借助LinqPad/VS的智能提示快速生成属性:
var dc = new OrderDB(Util.Connection); var order = dc.Orders.Where(o => o.Id == 123) .Select(o => new Order { Id = o.Id, Description = o.Description, Code = o.Code, // 选中Order后按Ctrl+., 选择"生成构造函数"或"初始化所有属性"就能快速填充所有字段 }) .FirstOrDefault(); order.Dump();
虽然还是要列字段,但借助工具的智能提示能大幅提升效率,不用手动逐个输入。
内容的提问来源于stack exchange,提问作者Dennis
相关产品推荐
相关产品推荐

