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

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

阅读更多

对象标识

  • 运行库中的对象具有唯一标识。引用同一对象的两个变量实际上是引用此对象的同一实例。你更改一个变量后,可以通过另一个变量看到这些更改。
  • 关系数据库表中的行不具有唯一标识。由于每一行都具有唯一的主键,因此任何两行都不会共用同一键值。

实际上,通常我们是将数据从数据库中提取出来放入另一层中,应用程序在该层对数据进行处理。这就是 LINQ to SQL 支持的模型。将数据作为行从数据库中提取出来时,你不期望表示相同数据的两行实际上对应于相同的行实例。如果您查询特定客户两次,您将获得两行数据。每一行包含相同的信息。

对于对象。你期望在你反复向 DataContext 索取相同的信息时,它实际上会为你提供同一对象实例。你将它们设计为层次结构或关系图。你希望像检索实物一样检索它们,而不希望仅仅因为你多次索要同一内容而收到大量的复制实例。

在 LINQ to SQL 中,DataContext 管理对象标识。只要你从数据库中检索新行,该行就会由其主键记录到标识表中,并且会创建一个新的对象。只要您检索该行,就会将原始对象实例传递回应用程序。通过这种方式,DataContext 将数据库看到的标识(即主键)的概念转换成相应语言看到的标识(即实例)的概念。应用程序只看到处于第一次检索时的状态的对象。新数据如果不同,则会被丢弃。

LINQ to SQL 使用此方法来管理本地对象的完整性,以支持开放式更新。由于在最初创建对象后唯一发生的更改是由应用程序做出的,因此应用程序的意向是很明确的。如果在中间阶段外部某一方做了更改,则在调用 SubmitChanges() 时会识别出这些更改。

以上来自MSDN,的确,看了有点“正规”,下面我用两个例子说明一下。

对象缓存

在第一个示例中,如果我们执行同一查询两次,则每次都会收到对内存中同一对象的引用。很明显,cust1和cust2是同一个对象引用。

Customer cust1 = db.Customers.First(c => c.CustomerID == "BONAP");
Customer cust2 = db.Customers.First(c => c.CustomerID == "BONAP");

下面的示例中,如果您执行返回数据库中同一行的不同查询,则您每次都会收到对内存中同一对象的引用。cust1和cust2是同一个对象引用,但是数据库查询了两次。

Customer cust1 = db.Customers.First(c => c.CustomerID == "BONAP");
Customer cust2 = (
    from o in db.Orders
    where o.Customer.CustomerID == "BONAP"
    select o )
    .First()
    .Customer;

 

分享到:
评论

相关推荐

    ASP.NET 3.5与LINQ

    它们允许开发人员以面向对象的方式操作数据库,而无需编写复杂的SQL语句。这不仅提高了代码的可读性和可维护性,也减少了出错的机会。 ##### 4.2 XML处理 除了数据库之外,LINQ to XML 还为处理XML文档提供了强大...

    LINQ综合学习

    - **数据库操作**:可以直接在C#代码中执行增删改查操作,而无需编写SQL语句。 - **延迟加载**:只有当访问实体的具体属性时才加载数据,从而提高了性能。 ##### 3.4 LINQ to Entities - **跨多种数据存储**:适用...

    linq入门到精通的学习笔记

    DataContext不仅负责将查询转换为SQL语句,还管理对象的状态,确保数据的一致性。例如,当数据库操作完成后,DataContext可以跟踪这些变化并适时地将它们提交回数据库。通过实现logging功能,DataContext可以记录...

    ASP.NET中实现根据匿名类、datatable、sql生成实体类

    本知识库将详细介绍如何使用匿名类、DataTable、SQL语句生成实体类。 首先,我们需要了解几种场景下实体类生成的需求: 1. EF或LINQ查询可能返回匿名对象,但这些对象在其他地方调用时不方便,手动创建实体类又...

    什么是linq技术?.docx

    - **LINQ表达式**:类似于SQL语句,LINQ也有其特有的查询语法。常见的关键字包括`select`、`where`、`orderby`等,这些关键字的用法与SQL类似。 - **返回值**:LINQ表达式的结果通常是一个实现了`IEnumerable<T>`...

    LINQ综合学习大全.doc

    例如,使用LINQ to SQL,你可以直接在C#对象上执行数据库查询,而无需关心底层的SQL语句。扩展方法则是实现LINQ的关键技术,它们是静态方法,但可以像实例方法一样被调用,使任何类型都可以扩展以支持查询操作。匿名...

    Sams.LINQ.Unleashed.for.C.Sharp.Jul.2008

    LINQ是一种集成在.NET Framework 3.5中的查询技术,它允许开发人员以类似SQL的方式编写查询语句,并且可以在多种数据源上运行这些查询,包括内存中的对象、数据库以及XML文档等。 #### 内容部分解读 ##### 版权...

    SQL判断是否存在表

    这样的需求通常出现在数据库初始化脚本或动态SQL语句中,以避免因对象不存在而引发错误。下面将详细介绍如何通过SQL语句来判断表、视图、存储过程等是否存在,并提供相应的示例代码。 ### 1. 判断数据库是否存在 `...

    那天有个小孩跟我说Linq (四)

    5. **数据库操作**:使用LINQ to SQL或Entity Framework进行数据库交互,包括创建数据库上下文、映射实体模型、执行CRUD操作。 6. **联接查询**:演示如何使用LINQ进行表之间的连接查询。 7. **分组与聚合**:介绍...

    SQL server列自动增加方法

    在SQL Server数据库设计中,有时候我们需要创建一个列,它的值能自动递增,这通常用于主键字段,确保每一行数据都有唯一的标识。这个特性在SQL Server中被称为“标识列”(Identity Column)。下面我们将详细讲解...

    图书管理系统C#+SQLserver源码

    - **LINQ to SQL**:简化了数据访问层的编写,支持对象关系映射(ORM)。 - **异常处理**:通过try-catch-finally语句块捕获并处理可能出现的异常情况。 - **安全性**:采用MD5加密技术对用户密码进行加密存储,防止...

    EF学习笔记

    而Native SQL允许直接执行原生SQL语句。 对于一对多关系,默认映射的属性是主键为Id||表名Id。开发者可以通过IObjectContextAdapter接口将DbContext转换为ObjectContext,以执行更底层的数据库操作。 最后,EF对于...

    ASP.NET 直接绑定标准SQL数据表的树

    例如,使用Linq-to-SQL或Entity Framework获取数据,然后使用`DataSourceID`属性绑定数据源,或者在代码-behind中动态添加节点: ```csharp // 假设ds是已填充的SqlDataSource TreeView1.DataSource = ds; TreeView...

    ASP.NET与XML

    也可以使用LINQ to SQL或Entity Framework进行更高级的数据查询。 "添加客户信息": 添加客户信息涉及向数据库插入新记录。首先,创建一个新的客户对象,并设置其属性,如姓名、联系方式等。然后,通过ADO.NET或ORM...

Global site tag (gtag.js) - Google Analytics