Link To Sql简单
Linq及其扩展
Linq是一种数据查询语言(它能够从多种数据源中查询数据). 现在基于Linq的扩展有:
- Linq To Object:主要是从内存对象中查询数据
- Linq To Sql:主要是从MS Sql Server数据库中操纵(查询\新增\修改\删除)数据
- Linq To XML:主要是从XML片段或XML文档中查询数据
Linq To Sql简介
Linq To Sql是一个微软在.NET Framework 3.5中推出的一款ORM(Object Relation Model)实体框架.一个好的实体框架除了能够将数据表映射为实体类,还应该支持使用面向的思想去操纵关系型数据库.现在比较流行的ORM框架包括:Linq To Sql\Entity Framework\Nhibernate等.
我们在使用Linq To Sql的过程中,很少去手写SQL语句就能实现常见的数据增删改差操作.但是它的底层实现仍然是Ado.net.那么如何检测Linq To Sql生成的SQL语句呢?通过DataContext的Log属性即可实现检测功能.

Linq To Sql设计器
在服务器资源管理器中通过拖拽的方式,将数据表放置到Linq To Sql的设计器区域后,VS会自动将这些数据表生成N+1(N为数据表的个数)个类.这些类大致可以分为2种:一种是数据库上下文,另一种是实体类.数据库上下文类就是名称以DataContext结尾的类,它继承自Sytem.Data.Linq.DataContext.
他们的作用分别是:DataContext类用于和数据库交互(增删改查),每次进行数据库操作时,都应该先创建该类对象;
而每一个实体类则和数据表相对应.
DataContext的特性标记为Database,表示与数据库相关

实体类的特性标记是Table,表示与数据表相关

实体类中属性的特性标记是Column,表示与数据列相关

DataContext数据库上下文类的常用属性和方法
CreateDatabase():创建数据库
DeleteDatabase():删除数据库
DatabaseExits():判断数据库是否存在
Log:该属性用于检测和写入LINQ TO SQL生成的SQL语句
Linq To Sql常用操作
新增数据
void InsertOnSubmit():实现每次新增1条记录
void InsertAllOnSubmit():实现一次新增多条记录
注意:调用InsertOnSubmit后,一定要再调用DataContext.SubmitChanges();

修改数据
首先,查询到要修改的元素
其次,改变元素相应的属性
最后,调用dataContext.SubmitChanges()

删除数据
首先,查询到要删除的元素
其次,调用void DeleteOnSubmit()删除单个元素,如果要删除多个可以调用void DelteAllOnSubmit()
最后,调用dataContext.SubmitChanges();

数据查询
数据查询时,有2种常用的使用方式.一种是使用linq的标准语法;一种是使用Lambda表达式扩展方法.
单表查询:

多表查询:

典型应用场景
场景1:在一个页面中实现:添加一个工资模版,以及该工资模版的多个工资条目

做法一:

做法二:

上述两种做法都可以实现功能.做法一是先实现工资模版的新增,然后再新增工资条目.做法二是向工资模版对象中添加多个工资条目,然后向数据库提交工资模版.
需要注意的是,做法一中为工资条目对象设置了工资模版ID,而做法二并没有为工资条目设置工资模版ID.但为什么最后效果却是一样的呢?
因为我们将工资条目添加到工资模版对象中时,linq to sql会自动将主外键关系的字段赋值.
场景二:使用Linq To Sql进行分页
分页功能需要使用两个函数进行组合:Skip()和Take()
Skip(int count):跳过count条数据
Take(int count):从开始位置提取count条记录
分页查询: dataContext.XXX.Skip(pageIndex * pageSize).Take(pageSize)
pageIndex是要提取的第几页记录.pageIndex >= 0
pageSize是每页显示的记录条数
其他
- EntitySet<T>:该类表示数据实体的集合
- System.Data.Linq.Table<T>:该类表示数据表对象
- 如何判定通过Linq To Sql进行数据的修改\删除\新增是否成功?
因为InsertOnSubmit方法和DataContext.SubmitChanges()方法都没有任何返回值,所以无法通过他们判断出是否操作成功.判断的标准就是:如果不抛出异常就成功,抛出异常肯定就失败了.
- 对于标识列(自动生成列)而言,在调用DataContext.XXX.InsertOnSubmit()后是无法获取标识列的值的;只有在调用DataContext.SubmitChanges()后方能获取标识列的值.
Link To Sql简单的更多相关文章
- MVC 学习(二)之Linq to Sql 简单Demo
Linq to Entities 已经我的一篇博文中阐述了,这里阐述一下简单的Linq to Sql 的增删改查.Linq to sql 与Linq to Entities虽然同属于DataBase- ...
- Linq to SQL 简单的增删改操作
Linq to SQL 简单的增删改操作. 新建数据库表tbGuestBook.结构如下: 新建web项目,完成相应的dbml文件.留言页面布局如下 <body> <form id= ...
- Mybatis动态SQL简单了解 Mybatis简介(四)
动态SQL概况 MyBatis 的强大特性之一便是它的动态 SQL 在Java开发中经常遇到条件判断,比如: if(x>0){ //执行一些逻辑........ } Mybatis应用中,S ...
- Oracle笔记 六、PL/SQL简单语句块、变量定义
1.简单SQL语句,HellWorld示例 --输出信息 begin dbms_output.put_line('Oracle Hello World!'); end; 2.变量的定义.使用 --定义 ...
- PL/SQL简单使用——导入、导出数据表
1.使用PL/SQL导出.导入表 在使用PL/SQL操作oracle数据库时,经常使用的一个操作就是将自己写的数据表导出,或者想把他人的数据表导入到自己的数据库中.虽然是很简单的操作,但自己之前一直出 ...
- Spark的Streaming和Spark的SQL简单入门学习
1.Spark Streaming是什么? a.Spark Streaming是什么? Spark Streaming类似于Apache Storm,用于流式数据的处理.根据其官方文档介绍,Spark ...
- SQL简单基础(1)
对于SQL不再做过多的介绍,毕竟作为一个初学者对于SQL(结构化查询语言)也好,关系型数据库也好理解都并不是很深,只知道一些基本的概念. 本系列旨在介绍一些简单开发中用得上的SQL语句以及其使用方法, ...
- SQL简单基础(2)
查询功能是SQL语句最重要的功能,查询操作也是数据库系统最常用的操作.学习SQL查询语句,首先要弄清楚的是查询语句用到的关键字以及查询语句的执行顺序.SQL语言的一个特点在于,它是一种声明式语句,执行 ...
- sql 简单语法
1.数据库操作 create database student_info -- 创建数据库 drop database student_info -- 删除数据库 2.表操作 -- 创建表 creat ...
随机推荐
- java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
在ViewPager中,用Fragment显示页面时,报错: java.lang.IllegalStateException: The specified child already has a pa ...
- Sublime text 3 中Package Control 的安装与使用方法和解决Sublime Text 3不能正确显示中文的问题
Sublime text 3 中Package Control 的安装与使用方法,英文好可以在这个网址看看, 下面简单的说明一下 : https://packagecontrol.io/install ...
- C#中的线程(二) 线程同步基础
1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...
- package、import和import static
package 语句: 该语句必须作为源文件的第一条非注释性语句,一个源文件只能指定一个包,即只能包含一条package语句. import 和import static 关键字: 引入import关 ...
- Bootstrap插件系列——Bootstrap-table初始化、分页、客户端搜索、服务端搜索
又好久不写博客,最近项目都是用的bootstrap的样式,不出意外,应该是要在bootstrap的道路上越走越远了,所以下定决心,把bootstrap的插件都好好学学. 昨天写了boostrap-ta ...
- NSLock线程锁的使用测试
测试1:NSLock线程锁是不是单例? 打印: 结论1:NSLock不是单例 测试2:同一个线程锁在不同的地方锁定,是否会有锁定两个? 打印为: 结论2:顺序打印,在不同的地方锁定也可以锁定. 测试3 ...
- ADV-时间分配
#include<stdio.h> int map[20][4]; typedef struct node{ int star; int end; }node; node dui[100] ...
- 项目jar包管理,使用 .userlibraries 文件增加jar包的可移植性,明确jar包依赖,多项目共用jar包里
当一个普通的项目,在不适用maven 等jar包管理工具的时候,通常我都会直接把jar 包复制lib下,并且在build path 中直接添加额外jar包,或者使用user_libraries包所用的 ...
- mouseover、mouseout,mouseenter、mouseleave区别
心情压抑的一天,我想好好的. mouseover与mouseenter 不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件. 只有在鼠标指针穿过被选元素时,才会触发 mouseen ...
- 原生JS中apply()方法的一个值得注意的用法
今天在学习vue.js的render时,遇到需要重复构造多个同类型对象的问题,在这里发现原生JS中apply()方法的一个特殊的用法: var ary = Array.apply(null, { &q ...