对象加载延迟加载
在查询某对象时,实际上你只查询该对象。不会同时自 动获取这个对象。这就是延迟加载。
例如,您可能需要查看客户数据和 订单数据。你最初不一定需要检索与每个客户有关的所有订单数据。其优点是你 可以使用延迟加载将额外信息的检索操作延迟到你确实需要检索它们时再进行。 请看下面的示例:检索出来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 请求相关数据,以便稍 后在检索到的各个对象中导航时不需要对数据库进行额外的往返。