LINQ to SQL语句(17)之对象加载

对象加载延迟加载

在查询某对象时,实际上你只查询该对象。不会同时自 动获取这个对象。这就是延迟加载。

例如,您可能需要查看客户数据和 订单数据。你最初不一定需要检索与每个客户有关的所有订单数据。其优点是你 可以使用延迟加载将额外信息的检索操作延迟到你确实需要检索它们时再进行。 请看下面的示例:检索出来CustomerID,就根据这个ID查询出OrderID。

var custs =
   from c in db.Customers
   where c.City == "Sao Paulo"
   select c;
//上面 的查询句法不会导致语句立即执行,仅仅是一个描述性的语句,
只有需要的 时候才会执行它
foreach (var cust in custs)
{
   foreach (var ord in cust.Orders)
  {
    //同时查看客 户数据和订单数据
  }
}

语句描述:原始查询未请求数 据,在所检索到各个对象的链接中导航如何能导致触发对数据库的新查询。

预先加载:LoadWith 方法

你如果想要同时查询出一些对象的集合的 方法。LINQ to SQL 提供了 DataLoadOptions用于立即加载对象。方法包括:

LoadWith 方法,用于立即加载与主目标相关的数据。

AssociateWith 方法,用于筛选为特定关系检索到的对象。

使用 LoadWith方法指定应同时检索与主目标相关的哪些数据。例如,如果你知道你需 要有关客户的订单的信息,则可以使用 LoadWith 来确保在检索客户信息的同时 检索订单信息。使用此方法可仅访问一次数据库,但同时获取两组信息。

在下面的示例中,我们通过设置DataLoadOptions,来指示DataContext 在加载Customers的同时把对应的Orders一起加载,在执行查询时会检索位于Sao Paulo的所有 Customers 的所有 Orders。这样一来,连续访问 Customer 对象 的 Orders 属性不会触发新的数据库查询。在执行时生成的SQL语句使用了左连 接。

NorthwindDataContext db = new NorthwindDataContext ();
DataLoadOptions ds = new DataLoadOptions();
ds.LoadWith<Customer>(p => p.Orders);
db.LoadOptions = ds;
var custs = (
   from c in db2.Customers
   where c.City == "Sao Paulo"
   select c);
foreach (var cust in custs)
{
  foreach (var ord in cust.Orders)
  {
    Console.WriteLine ("CustomerID {0} has an OrderID {1}.",
       cust.CustomerID,
      ord.OrderID);
  }
}

语句描述:在原始查询过程中使用 LoadWith 请求相关数据,以便稍 后在检索到的各个对象中导航时不需要对数据库进行额外的往返。

时间: 2024-10-25 10:46:34

LINQ to SQL语句(17)之对象加载的相关文章

LINQ to SQL语句(16)之对象标识

对象标识 运行库中的对象具有唯一标识.引用同一对象的两个变量实际上 是引用此对象的同一实例.你更改一个变量后,可以通过另一个变量看到这些更 改. 关系数据库表中的行不具有唯一标识.由于每一行都具有唯一的主 键,因此任何两行都不会共用同一键值. 实际上,通常我们是将数据从 数据库中提取出来放入另一层中,应用程序在该层对数据进行处理.这就是 LINQ to SQL 支持的模型.将数据作为行从数据库中提取出来时,你不期望表示 相同数据的两行实际上对应于相同的行实例.如果您查询特定客户两次,您将获 得两

LINQ体验(9)——LINQ to SQL语句之Insert/Update/Delete操作

我们继续讲解LINQ to SQL语句,这篇我们来讨论Insert/Update/Delete操作 .这个在我们的程序中最为常用了.我们直接看例子. Insert/Update/Delete操作插入(Insert)1.简单形式 说明:new一个 对象,使用InsertOnSubmit方法将其加入到对应的集合中,使用SubmitChanges ()提交到数据库. NorthwindDataContext db = new NorthwindDataContext(); var newCustome

LINQ体验(7)-LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains

我们继续讲解LINQ to SQL语句,这篇我们来讨论Group By/Having操作符和 Exists/In/Any/All/Contains操作符. Group By/Having操作符 适用 场景:分组数据,为我们查找数据缩小范围. 说明:分配并返回对传入 参数进行分组操作后的可枚举对象.分组:延迟 1.简单形式: var q = from p in db.Products group p by p.CategoryID into g select g; 语句描述:使用Group By

LINQ体验(5)——LINQ to SQL语句之Select/Distinct和Count/Sum/Min/Max/Avg

上一篇讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ to SQL语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects.LINQ to DataSets.LINQ to SQL.LINQ to Entities.LINQ to XML,但是相对来说LINQ to SQL在我们程序中使用最多,毕竟所 有的数据都要在数据库运行着各种操作.所以先来学习LINQ to SQL,其它的都差不多了,那么就从Select说起吧,这个在编写程序中也最为常

LINQ体验(8)—LINQ to SQL语句之Union All/Union/Intersect和Top/Bottom和Pag

LINQ体验(8)-LINQ to SQL语句之Union All/Union/Intersect和Top/Bottom和Paging和SqlMethods 我们继续讲解LINQ to SQL语句,这篇我们来讨论Union All/Union/Intersect操作和Top/Bottom操作和Paging操作和SqlMethods操作 . Union All/Union/Intersect操作 适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不

LINQ体验(12)——LINQ to SQL语句之对象标识和对象加载

对象标识 运行库中的对象具有唯一标识.引用同一对象的两个变量实际上 是引用此对象的同一实例.你更改一个变量后,可以通过另一个变量看到这些更 改. 关系数据库表中的行不具有唯一标识.由于每一行都具有唯一的主 键,因此任何两行都不会共用同一键值. 实际上,通常我们是将数据从数据库中提取出来放入另一层中,应用程序在该层对数据进行处理.这就是 LINQ to SQL 支持的模型.将数据作为行从数据库中提取出来时,你不期望表示 相同数据的两行实际上对应于相同的行实例.如果您查询特定客户两次,您将获 得两行

LINQ体验(17)——LINQ to SQL语句之动态查询

高级特性 本文介绍LINQ的高级特性,其包括大家都关心的动态查询的用法 ,另外简单提下ID标识这个知识. 动态查询 有这样一个场景:应用程 序可能会提供一个用户界面,用户可以使用该用户界面指定一个或多个谓词来筛 选数据.这种情况在编译时不知道查询的细节,动态查询将十分有用. 在LINQ中,Lambda表达式是许多标准查询运算符的基础,编译器创建lambda表达 式以捕获基础查询方法(例如 Where.Select.Order By.Take While 以及其 他方法)中定义的计算.表达式目录树

LINQ to SQL语句(19)之ADO.NET与LINQ to SQL

ADO.NET与LINQ to SQL 它基于由 ADO.NET 提供程序模型提供的服务.因 此,我们可以将 LINQ to SQL 代码与现有的 ADO.NET 应用程序混合在一起,将 当前 ADO.NET 解决方案迁移到 LINQ to SQL. 1.连接 在创建 LINQ to SQL DataContext 时,可以提供现有 ADO.NET 连接.对 DataContext 的所 有操作(包括查询)都使用所提供的这个连接.如果此连接已经打开,则在您使 用完此连接时,LINQ to SQL

LINQ to SQL语句(10)之Insert

插入(Insert)1.简单形式 说明:new一个对象,使用InsertOnSubmit方法 将其加入到对应的集合中,使用SubmitChanges()提交到数据库. NorthwindDataContext db = new NorthwindDataContext(); var newCustomer = new Customer { CustomerID = "MCSFT", CompanyName = "Microsoft", ContactName = &