`
chungle
  • 浏览: 59992 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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 请求相关数据,以便稍后在检索到的各个对象中导航时不需要对数据库进行额外的往返。

延迟加载:AssociateWith方法

使用 AssociateWith 方法指定子查询以限制检索的数据量。
在下面的示例中,AssociateWith 方法将检索的 Orders 限制为当天尚未装运的那些 Orders。如果没有此方法,则会检索所有 Orders,即使只需要一个子集。但是生成SQL语句会发现生成了很多SQL语句。

NorthwindDataContext db2 = new NorthwindDataContext();
DataLoadOptions ds = new DataLoadOptions();
ds.AssociateWith<Customer>(
     p => p.Orders.Where(o => o.ShipVia > 1));
db2.LoadOptions = ds;
var custs =
     from c in db2.Customers
     where c.City == "London"
     select c;
foreach (var cust in custs)
{
    foreach (var ord in cust.Orders)
    {
        foreach (var orderDetail in ord.OrderDetails)
        {
           //可以查询出cust.CustomerID, ord.OrderID, ord.ShipVia,
           //orderDetail.ProductID, orderDetail.Product.ProductName
        }
    }
}

语句描述:原始查询未请求数据,在所检索到各个对象的链接中导航如何以触发对数据库的新查询而告终。此示例还说明在延迟加载关系对象时可以使用 Assoicate With 筛选它们。

预先加载:LoadWith方法和Associate With方法

这个例子说明:使用LoadWith方法来确保在检索客户信息的同时检索订单信息,在检索订单信息的同时检索订单详细信息, 仅仅访问一次数据库。即可以在一个查询中检索许多对象。使用Associate With方法来限制订单详细信息的排序规则。

NorthwindDataContext db2 = new NorthwindDataContext();
DataLoadOptions ds = new DataLoadOptions();
ds.LoadWith<Customer>(p => p.Orders);
ds.LoadWith<Order>(p => p.OrderDetails);
ds.AssociateWith<Order>(
     p => p.OrderDetails.OrderBy(o => o.Quantity));
db2.LoadOptions = ds;
var custs = (
     from c in db2.Customers
     where c.City == "London"
     select c);
foreach (var cust in custs)
{
    foreach (var ord in cust.Orders)
    {
        foreach (var orderDetail in ord.OrderDetails)
        {
           //查询cust.CustomerID, ord.OrderID
           //orderDetail.ProductID, orderDetail.Quantity
        }
    }
}

语句描述:在原始查询过程中使用 LoadWith 请求相关数据,以便稍后在检索到的各个对象中导航时此示例还说明在急切加载关系对象时可以使用 Assoicate With 对它们进行排序。

加载重写

这个例子在Category类里提供了一个LoadProducts分部方法。当产品的类别被加载的时候,就直接优先调用了LoadProducts方法来查询没有货源的产品。

private IEnumerable<Product> LoadProducts(Category category)
{
    //在执行LINQ to SQL的时候,这个LoadProducts分部方法
    //优先加载执行,这里用存储过程也可以. 
    return this.Products
        .Where(p => p.CategoryID == category.CategoryID)
        .Where(p => !p.Discontinued);
}

执行下面的查询时,利用上面方法返回的数据进行下面的操作:

NorthwindDataContext db2 = new NorthwindDataContext();
DataLoadOptions ds = new DataLoadOptions();
ds.LoadWith<Category>(p => p.Products);
db2.LoadOptions = ds;
var q = (
     from c in db2.Categories
     where c.CategoryID < 3
     select c);
foreach (var cat in q)
{
    foreach (var prod in cat.Products)
    {
       //查询cat.CategoryID, prod.ProductID
    }
}

语句描述:重写 Category 类中的分部方法 LoadProducts。加载某种类别的产品时,调用 LoadProducts 以加载此类别中未停产的产品。

分享到:
评论

相关推荐

    LINQ to SQL语句(11)之Update

    - **部分更新**:如果你只想更新对象的一部分属性,可以使用`DataContext.GetChangeSet()`方法来检查哪些属性已改变,并仅针对这些属性生成SQL语句。 - **条件更新**:有时你可能希望基于某些条件更新记录。这可以...

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

    在“LINQ to SQL语句(16)之对象标识”这个主题中,我们将深入探讨如何处理对象的标识性,这是在数据库操作中一个关键的概念。在关系型数据库中,每个表通常都有一个主键字段,用于唯一标识每条记录,这就是所谓的...

    LINQ To SQL实现分页效果源码

    由于LINQ延迟执行,直到你真正遍历结果集时才会执行SQL语句。 ```csharp foreach (var customer in pagedQuery) { // 处理每个customer对象 } ``` 5. **优化性能**:在某些情况下,为了提高性能,你可能需要...

    LINQ to SQL语句(9)之Top 和Bottom和Paging和SqlMethods

    本篇文章将深入探讨LINQ to SQL语句中关于“Top”、“Bottom”、分页(Paging)以及SqlMethods的相关知识。 首先,让我们来理解“Top”和“Bottom”这两个概念。在SQL中,`TOP`用于选取结果集的前N行,而“Bottom”...

    c#linq to sql

    8. **存储过程的支持**:虽然LINQ to SQL主要是用于执行简单的SQL语句,但也可以调用存储过程,并将返回的结果映射到对象。 9. **自定义SQL查询**:当标准的LINQ查询无法满足需求时,可以使用ExecuteQuery方法执行...

    Linq to Sql 教程大全

    它提供了将数据库表映射到.NET Framework中类的能力,允许开发人员通过编写LINQ查询而不是SQL语句来操作数据。 #### 二、LINQ to SQL 的基本概念 - **数据上下文(DataContext)**:用于连接数据库并管理对数据库...

    LINQ To Sql学习文档

    LINQ To SQL 作为 LINQ 的一部分,主要用于处理关系型数据库中的数据,它能够将 SQL 查询语句转换为 .NET 语言中的对象操作。 #### 二、Visual Studio 2008 新特性及其对 LINQ 的支持 - **.NET Framework 对重定向...

    linq to sql 学习笔记

    - **日志功能**:DataContext支持日志记录,可以通过设置Log属性将查询转换的SQL语句和执行结果输出到日志,方便调试和性能分析。 3. LINQ to SQL的操作 - **查询**:使用查询表达式或方法语法,可以从...

    LINQ to SQL语句(22)之DataContext

    LINQ to SQL是.NET Framework提供的一种ORM(对象关系映射)技术,它允许开发者使用C#或VB.NET的查询语法来操作数据库,将SQL语句转化为直观的面向对象的代码。在LINQ to SQL中,`DataContext`是一个核心组件,它是...

    linq to sql学习资料(全word文档)

    "LINQ to SQL"是LINQ的一个特定实现,它允许开发者直接在SQL Server数据库上执行查询,将SQL语句转换为.NET代码,极大地简化了数据访问层的操作。本学习资料包涵盖了并发控制、事务管理、查询语法以及存储过程等多个...

    Linq to sql Memcached封装

    Linq to SQL通过ORM(对象关系映射)方式将数据库表映射为.NET类,让开发者可以直接对对象进行操作,而无需编写大量的SQL语句。 Memcached则是一种高性能、分布式内存对象缓存系统,用于加速动态Web应用程序。它...

    LINQ to SQL技术进行增删改查!

    LINQ to SQL还支持延迟加载,即当需要时才加载关联的对象,这有助于减少数据库交互次数,提高性能。另外,它提供了事务支持,可以在一组操作中确保数据一致性。 总的来说,LINQ to SQL提供了一种优雅的方式来进行...

    LINQ教程中文版(LINQ TO SQL ,LINQ TO XML)

    它的主要优点在于,可以将数据库表和数据库操作映射到.NET类和方法,从而减少了与数据库交互时的手动编写SQL语句。以下是LINQ to SQL的一些关键概念: 1. **数据库上下文(DataContext)**:这是LINQ to SQL的核心...

    LINQ_to_SQL语法及实例大全

    1. LINQ to SQL语句之Where:Where语句用于对数据进行筛选,基本形式是根据特定条件进行过滤。它包括简单形式、关系条件形式和First()形式。简单形式一般用于单个条件的判断,关系条件形式支持多条件组合判断,而...

    _____Linq_to_sql.rar_linq to sql微软

    3. **查询语法**:使用LINQ,你可以编写类似SQL的查询,如`from`、`where`、`select`等,这些查询语句会自动转换为对应的SQL语句执行。 4. **CRUD操作**:插入、更新和删除数据库记录变得非常简单,只需要调用对象...

    通过Linq操作Sql Server数据库

    Linq to SQL通过DBML文件(.dbml)或代码First方式定义数据库表与对象之间的映射关系。DBML是图形化的设计工具,而代码First则通过C#或VB.NET代码定义模型。 **7.事务处理** Linq支持数据库事务,可以通过...

    linq to sql

    - **定义与功能**:LINQ to SQL是Microsoft提供的一种对象关系映射器(Object-Relational Mapping,ORM),它允许开发者以面向对象的方式操作数据库。通过将数据库表映射为.NET类,并自动生成SQL查询语句,使得数据...

    linq to sql进阶 教程

    2. **实体类映射(Mapping)**:LINQ to SQL通过ORM(对象关系映射)技术将数据库表映射为.NET类。我们将学习如何自动生成这些类,以及如何手动调整映射以满足特定需求。 3. **查询语法**:包括查询表达式(Query ...

    LINQ_to_sql详细教程

    其中,LINQ to SQL 是专门用于操作 SQL Server 数据库的组件,它将数据库表映射为 C# 或 VB.NET 类,使开发者能以面向对象的方式编写数据库操作代码。 ### LINQ to Object 初体验 在 LINQ 中,LINQ to Object 是...

Global site tag (gtag.js) - Google Analytics