LINQ的优点是提供了在代码中使用强类型化对象,这些对象还映射到以后的数据库对象上
下面是数据库对象和LINQ对象的映射关系
数据库对象 | LINQ对象 |
数据库 | DataContext |
表 | 类和集合 |
视图 | 类和集合 |
列 | 属性 |
关系 | 嵌套集合 |
存储过程 | 方法 |
左列是数据库,数据库是一个完整的实体--表、视图、触发器、存储过曾构成了数据库
右列是LINQ对象
DataContext对象,他绑定到数据库上,为了与数据库进行必要的交互操作,该对象包含一个连接字符串,并管理所发生的所有事物的处理,还负责记录操作,管理数据的输出。Data对象全面管理与数据库的事务处理。
数据库关系,各个对象之间映射的嵌套集合。
存储过程,会映射为DataContext实例的方法上
在调用一个Linq查询 dc.Products 的时候
查询会被LINQ to SQL 转换成为SQL查询语句,提供给数据库,LINQ to SQL 层通过这个查询从数据库中获得行数据,把返回的数据编程强力型对象集合,便于使用。
DataContext对象
DataContext对象管理所发生的所有事物的处理,并提供操作接口
实例化DataContext对象有三个可选参数(数据名,连接串,另一个DataContext对象)
1.使用ExecuteQuery,查询所有产品集合
- public void UsingExecuteQuery()
- {
- // using ExecuteQuery
- //获得一个DataContext对象,注意他使用的是DataContext
- DataContext dc = new DataContext(ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ToString());
- //执行一个明文查询,并返回一个集合,注意泛型的使用
- IEnumerable<Products> myProducts = dc.ExecuteQuery<Products>("SELECT * FROM PRODUCTS", "");
- //便利集合
- foreach (Products item in myProducts)
- {
- Response.Write(item.ProductID + " | " + item.ProductName + "<br />");
- }
- }
如果想要添加参数的查询可以使用以下占位符的形式
- IEnumerable<Products> myProducts = dc.ExecuteQuery<Products>("SELECT * FROM PRODUCTS WHERE UnitsInStock > {0}", 50);
2.Connection 属性 返回一个 System.Data.SqlClient.SqlConnection实例
- public void Connection()
- {
- //注意这里使用的是NorthwindDataContext对象
- NorthwindDataContext dc = new NorthwindDataContext();
- Response.Write(dc.Connection.ConnectionString);
- }
3.Transaction 属性
如果有一个可以使用的Ado.net 事物,就可以使用Transaction 属性把这个事务处理赋予DataContext对象实例。 还可以像下面是用 TransactionScope 实现事务,如果数据库操作失败,就回退所有操作,返回最初状态
- public void Transaction()
- {
- NorthwindDataContext dc = new NorthwindDataContext();
- using (TransactionScope myScope = new TransactionScope())
- {
- //新建产品
- Products p1 = new Products() { ProductName = "Bill's Product" };
- //插入这个产品,并且获得插入后的p1信息
- dc.Products.InsertOnSubmit(p1);
- Products p2 = new Products() { ProductName = "Another Product" };
- dc.Products.InsertOnSubmit(p2);
- try
- {
- dc.SubmitChanges();
- //返回刚刚插入数据的ID值
- Response.Write(p1.ProductID + "<br />");
- Response.Write(p2.ProductID + "<br />");
- }
- catch (Exception ex)
- {
- Response.Write(ex.ToString());
- }
- //指示操作以完成
- myScope.Complete();
- }
4.DataContext 的方法和属性
方法:
名称 | 说明 | |
---|---|---|
![]() | CreateDatabase | 在服务器上创建数据库。 |
![]() | CreateMethodCallQuery(OfTResult) | 基础结构。执行与指定的 CLR 方法相关联的表值数据库函数。 |
![]() | DatabaseExists | 确定是否可以打开关联数据库。 |
![]() | DeleteDatabase | 删除关联数据库。 |
![]() | Dispose | 释放由 DataContext 使用的所有资源。 |
![]() | Dispose(Boolean) | 释放由 DataContext 使用的资源。 |
![]() | Equals(Object) | 确定指定的 Object 是否等于当前的Object。 (继承自Object。) |
![]() | ExecuteCommand | 直接对数据库执行 SQL 命令。 |
![]() | ExecuteDynamicDelete | 在删除重写方法中调用,以向 LINQ to SQL 重新委托生成和执行删除操作的动态 SQL 的任务。 |
![]() | ExecuteDynamicInsert | 在插入重写方法中调用,以向 LINQ to SQL 重新委托生成和执行插入操作的动态 SQL 的任务。 |
![]() | ExecuteDynamicUpdate | 在更新重写方法中调用,以向 LINQ to SQL 重新委托生成和执行更新操作的动态 SQL 的任务。 |
![]() | ExecuteMethodCall | 基础结构。执行数据库存储过程或与指定的 CLR 方法关联的标量函数。 |
![]() | ExecuteQuery(Type, String,Object()) | 直接对数据库执行 SQL 查询。 |
![]() | ExecuteQuery(OfTResult)(String,Object()) | 直接对数据库执行 SQL 查询并返回对象。 |
![]() | Finalize | 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自Object。) |
![]() | GetChangeSet | 提供对由 DataContext 跟踪的已修改对象的访问。 |
![]() | GetCommand | 提供有关由 LINQ to SQL 生成的 SQL 命令的信息。 |
![]() | GetHashCode | 用作特定类型的哈希函数。 (继承自Object。) |
![]() | GetTable(Type) | 返回特定类型的对象的集合,其中类型由type 参数定义。 |
![]() | GetTable(OfTEntity) | 返回特定类型的对象的集合,其中类型由TEntity 参数定义。 |
![]() | GetType | 获取当前实例的Type。 (继承自Object。) |
![]() | MemberwiseClone | 创建当前 Object 的浅表副本。 (继承自Object。) |
![]() | Refresh(RefreshMode, IEnumerable) | 按照指定模式刷新实体对象的集合。 |
![]() | Refresh(RefreshMode, Object) | 按照指定模式刷新实体对象。 |
![]() | Refresh(RefreshMode,Object()) | 按照指定模式刷新实体对象的数组。 |
![]() | SubmitChanges | 计算要插入、更新或删除的已修改对象的集,并执行相应命令以实现对数据库的更改。 |
![]() | SubmitChanges(ConflictMode) | 将对检索到的对象所做的更改发送到基础数据库,并指定提交失败时要采取的操作。 |
![]() | ToString | 返回表示当前对象的字符串。 (继承自Object。) |
![]() | Translate(DbDataReader) | 将现有 DbDataReader 转换为对象。 |
![]() | Translate(Type, DbDataReader) | 将现有 DbDataReader 转换为对象。 |
![]() | Translate(OfTResult)(DbDataReader) | 将现有 DbDataReader 转换为对象。 |
属性:
名称 | 说明 | |
---|---|---|
![]() | ChangeConflicts | 返回调用 SubmitChanges 时导致并发冲突的对象的集合。 |
![]() | CommandTimeout | 增大查询的超时期限,如果不增大则会在默认超时期限间出现超时。 |
![]() | Connection | 返回由框架使用的连接。 |
![]() | DeferredLoadingEnabled | 指定是否延迟加载一对多关系或一对一关系。 |
![]() | LoadOptions | 获取或设置与此DataContext 关联的DataLoadOptions。 |
![]() | Log | 指定要写入 SQL 查询或命令的目标。 |
![]() | Mapping | 返回映射所基于的MetaModel。 |
![]() | ObjectTrackingEnabled | 指示框架跟踪此DataContext 的原始值和对象标识。 |
![]() | Transaction | 为 .NET Framework 设置要用于访问数据库的本地事务。 |
Table<TEntity> 对象
Table<TEntity>对象表示在数据库中操作的表,数据库中的表都会表示成Table<TEntity>的实例,比如之前的Product可以表示成Table<Product>,有许多方法是可以用于Table<TEntity>对象,其中一些如下:
名称 | 说明 | |
---|---|---|
![]() | Attach(TEntity) | 如果执行开放式并发检查时需要原始值,请将已断开连接或“已分离”的实体附加到新的DataContext。 |
![]() | Attach(TEntity, Boolean) | 以修改或未修改状态将实体附加到DataContext。 |
![]() | Attach(TEntity, TEntity) | 通过指定实体及其原始状态,以修改或未修改状态将实体附加到DataContext。 |
![]() | AttachAll(OfTSubEntity)(IEnumerable(OfTSubEntity)) | 以修改或未修改状态将集合的所有实体附加到DataContext。 |
![]() | AttachAll(OfTSubEntity)(IEnumerable(OfTSubEntity), Boolean) | 以修改或未修改状态将集合的所有实体附加到DataContext。 |
![]() | DeleteAllOnSubmit(OfTSubEntity) | 将集合中的所有实体置于pending delete 状态。 |
![]() | DeleteOnSubmit | 将此表中的实体置为pending delete 状态。 |
![]() | Equals(Object) | 确定指定的 Object 是否等于当前的Object。 (继承自Object。) |
![]() | Finalize | 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自Object。) |
![]() | GetEnumerator | 获取此集合的枚举数。 |
![]() | GetHashCode | 用作特定类型的哈希函数。 (继承自Object。) |
![]() | GetModifiedMembers | 返回包含其当前和原始值的已修改成员的数组。 |
![]() | GetNewBindingList | 创建用于绑定到数据源的新列表。 |
![]() | GetOriginalEntityState | 返回包含实体的原始状态的实例。 |
![]() | GetType | 获取当前实例的Type。 (继承自Object。) |
![]() | InsertAllOnSubmit(OfTSubEntity) | 将集合中所有处于pending insert 状态的实体添加到DataContext。 |
![]() | InsertOnSubmit | 将处于 pending insert 状态的实体添加到此 Table(OfTEntity)。 |
![]() | MemberwiseClone | 创建当前 Object 的浅表副本。 (继承自Object。) |
![]() | ToString | 返回表示表的字符串。 (重写Object.ToString。) |