一篇文章学LINQ(原创)
本篇文章主要介绍linq的基本用法,采用sql和linq比较的方式由浅入深进行学习,
注意:此文章是根据真实表来进行案例说明,表结构如下:
表1: Student(学生表) 表2: Book(图书借阅管理表)
字段: Student_Id(学生ID) Book_Id(图书借阅ID)
Student_Name(学生姓名) Book_Name(书名)
Student_age(年龄) Book_StudentId(借阅者ID)
Student_Sex(性别) Book_Date(借阅日期)
Student_Phone(手机号可为Null) Book_Amount(借阅本数)
首先在MODEL层建立一个LINQ to
SQL类,取名为:Assemble.dbml,将表1和表2拖入到文件中形成
表结构对象(实体)。
在使用的时候使用AssembleDataContext D = new AssembleDataContext ();
注意以后D变量不再强调声明。
一: 查询出所有的学生记录
SQL: select * from Student
LINQ: IQueryable<Student> StudentLq = from StudentE in D. Student select StudentE;
二:根据条件进行查询(查询出年龄大于18并且性别为男,有手机的学生)
SQL: select * from Student
where Student_age>=18 and Student_Sex=’男’ and Student_Phone is not null
LINQ:(方法1,直接查询)
IQueryable<Student> StudentLq = from StudentE in D. Student
where
StudentE. Student_age >= 18 && StudentE. Student_Sex == ‘男’
&& StudentE. Student_Phone.HasValue
select
StudentE;
LINQ:(方法2,执行二次查询,这里直接使用Lambda表达式)
IQueryable<Student> StudentLq = from StudentE in D. Student select StudentE;
StudentLq=StudentLq.Where(W => W.Student_age >= 18 &&
W. Student_Sex == ‘男’ && W. Student_Phone.HasValue);
解析:SQL中的AND和OR分别对应LINQ中的&&和||
SQL中的is not null 和 is null 分别对应: 字段名.HasValue 和 !字段名.HasValue
如果只是根据ID或者某一条件查询出结果有且只有1条记录的话可以使用下面的LINQ语句
Student StudentLq = D.Student.Single(W => W.Student_Id == 1);
上面语句如果数据库中无记录或者有多条记录,会报错!
三:根据条件查询并排序(查询出年龄大于18,或者性别为女生的学生,并按年龄排序)
SQL: select *
from Student where Student_age>=18 or Student_Sex=’女’ order by Student_age desc
LINQ:(方法1,直接查询)
IQueryable<Student> StudentLq = from StudentE
in D. Student
where
StudentE. Student_age >= 18 || StudentE. Student_Sex == ‘女’
orderby StudentE. Student_age descending
select
StudentE;
解析:SQL中的ASC和DESC分别对应LINQ中的ascending 和 descending
如果先对年龄进行升序,在对学生ID进行降序,那么代码如下:
orderby StudentE. Student_age ascending,orderby StudentE. Student_Id descending
LINQ:(方法2,执行二次查询,这里直接使用Lambda表达式)
IQueryable<Student> StudentLq = from StudentE in D. Student select StudentE;
StudentLq=StudentLq.Where(W => W.Student_age >= 18 ||W. Student_Sex == ‘女’);
StudentLq=StudentLq.OrderByDescending(W => W.Student_age);
解析:先对某个字段进行升序使用OrderBy()方法,降序使用OrderByDescending()方法
再对某个字段进行升序使用ThenBy()方法,降序使用ThenByDescending()方法
如果先对年龄进行升序,在对学生ID进行降序,那么代码如下:
StudentLq=StudentLq.OrderBy(W => W.Student_age).ThenByDescending(W => W.Student_Id);
四:根据条件查询并计算值(查询出年龄小于18的学生个数)
SQL: select count(*) from Student where Student_age < 18
注意:count(*)统计总记录数 可以count(字段名) 统计某个字段的记录数
avg():计算平均值 max():计算最大值 min():计算最小值 sum():求和计算
LINQ: int ageCount = (from StudentE in D. Student
where StudentE. Student_age < 18
select StudentE).Count();
解释:上面的写法等同于下面方法:
int ageCount =D. Student.Count(StudentE => StudentE.Student_age < 18)
如果对某一个字段进行求个数的话,直接在取值的时候取出这个字段,然后求个数,如下:
例如:求2013年至今一共借出多少本书
SQL:select sum(Book_Amount) from Book where Book_Date > '2013-01-01'
LINQ:int bookCount = (from BookE in D. Book
where BookE. Book_Date > DateTime.Parse('2013-01-01')
select BookE.Book_Amount).Sum();
注:Count():求个数 Average():求平均 Min():求最小值 Max():求最大值,方法同Sum()的方法
五:IN操作(查询书名为"中国","母亲","散文"的记录)
SQL: select * from Book where Book_Name in ('中国','母亲','散文')
LINQ: string[] name = { "中国", "母亲", "散文"};
IQueryable<Book> BookLq= from BookE in D.Book
where name.Contains(BookE.Book_Name)
select BookE;
六:LIKE操作(查询书名中包括"中国"两字的记录)
SQL: select * from Book where Book_Name like '%中国%'
LINQ: IQueryable<Book> BookLq= from BookE in D.Book
where BookE.Book_Name.Contains("中国")
select BookE;
解释:EndsWith("中国"):已中国这两个字符结尾的书名 StartsWith(中国"):已中国这两个字符开始的书名
LIKE操作也可以使用一下方法:
IQueryable<Book> BookLq= from BookE in D.Book
where SqlMethods.Like(BookE.Book_Name, "%中国%")
select BookE;
七:查询并且筛选掉重复值(查询2013年至今哪些书被借出去过)
SQL:select distinct
Book_Name from Book where Book_Date > '2013-01-01'
LINQ: IQueryable<String> bookString = (from BookE in D. Book
where BookE. Book_Date > DateTime.Parse('2013-01-01')
select BookE.Book_Name).Distinct();
八:分组查询(查询哪些客户分别借了多少本书)
SQL:select Book_StudentId,sum(Book_Amount) from Book group by Book_StudentId
LINQ:IQueryable<Book> BookLq =from BookE in D.Book
group BookE by BookE.Book_StudentId into NesBook
orderby NesBook.Sum(W=> W.Book_Amount) descending //排序
select new {
BookStudentId =NesBook.Key,
BookAmount= NesBook.Sum(W=> W.Book_Amount)
};
解释:这只是根据哪个客户来分组的,如果根据客户和书名2个字段来分组,可以使用下面的代码:
IQueryable<Book> BookLq =from BookE in D.Book
group BookE by new {BookE.Book_StudentId,BookE.Book_Name}
into NesBook
orderby NesBook.Sum(W=> W.Book_Amount) descending //排序
select new {
BookStudentId =NesBook.Key.Book_StudentId,
BookName =NesBook.Key.Book_Name,
BookAmount= NesBook.Sum(W=> W.Book_Amount)
};
以下介绍内连接和外连接,这个时候我们先声明一个实体对象,方便我们实例的赋值!
public class NEW_LIST
{
public string Student_Name_List { get; set; }//学生姓名
public int Student_age_List { get; set; }//学生年龄
public string Book_Name_List { get; set; }//书名
public DateTime Book_Date_List { get; set; }//借阅日期
public int Book_Amount_List { get; set; } //借阅数据的个数
.......想要更多字段的可以在这里添加,我就不一 一写上了
}
九 :内连接(jion和inner jion)
jion和inner jion 用法一样 都是表中存在至少一个匹配时,返回行,
也就是说当2个表中拥有相同关联记录的时候才返回行
我们来看下面的例子:
取出2013年至今哪些学生借阅过哪些书籍[图书表里面有某一个学生,学生表里面没有的将不被查出]
SQL:SELECT Student.Student_Name, Student.Student_age, Book.Book_Name,
Book.Book_Date,Book.Book_Amount FROM Book INNER JOIN Student
ON Book.Book_StudentId=Student.Student_Id
where Book.Book_Date > '2013-01-01' order by Student.Student_Name desc
Linq:IQueryable<NEW_LIST> newLq = from bookE in D.Book
join StudentE in D.Student
on bookE.Book_StudentId equals StudentE.Student_Id
where bookE.Book_Date > '2013-01-01'
orderby StudentE.Student_Name descending
select new NEW_LIST
{
Student_Name_List = StudentE.Student_Name,
Student_age_List = StudentE.Student_age,
Book_Name_List = bookE.Book_Name,
Book_Date_List = bookE.Book_Date,
Book_Amount_List = bookE.Book_Amount
};
十 :外连接(left jion和right jion)
LEFT JOIN: 即使右表中没有匹配,也从左表返回所有的行
也就是说从左表1(主表)那里返回所有的行,即使在右表 (表2) 中没有匹配的行也照样查出记录
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
也就是说从右表 (表2[主表]) 那里返回所有的行,即使在左表 (表1) 中没有匹配的行
LEFT JOIN 和 RIGHT JOIN用法一样,主要是看把那个表作为主表查询出来
我们来看下面的例子:
取出2013年至今哪些书籍被学生借阅过[图书表里面有某一个学生,学生表里面没有的也将查询出图书记录]
SQL:SELECT Student.Student_Name, Student.Student_age, Book.Book_Name,
Book.Book_Date,Book.Book_Amount FROM Book LEFT JOIN Student
ON Book.Book_StudentId=Student.Student_Id
where Book.Book_Date > '2013-01-01' order by Student.Student_Name desc
Linq:IQueryable<NEW_LIST> newLq = from bookE in D.Book
join StudentE in D.Student
on bookE.Book_StudentId equals StudentE.Student_Id
into newsBook
from NbooE in newsBook.DefaultIfEmpty()
select new NEW_LIST
{
Student_Name_List = NbooE.Student_Name==null?"":NbooE.Student_Name,
Student_age_List = NbooE.Student_age==null?"":NbooE.Student_age,
Book_Name_List = bookE.Book_Name,
Book_Date_List = bookE.Book_Date,
Book_Amount_List = bookE.Book_Amount
};
十一:分页查询(查询2013年至今所借的图书信息,以及借阅者是谁,只查询出第1到第10条记录)
SQL: select * from (select row_number() over (order by Book_Date desc) as cid,
(select Student_Name from Student where Student_Id=Book_StudentId) as newBook_StudentName,
Book_Id,Book_Name,Book_Date,Book_Amount
from Book where Book_Date > '2013-01-01' ) NewBook
where NewBook.cid between 1 and 10 order by Book_Date desc
LINQ:
后续持续更新。。。
一篇文章学LINQ(原创)的更多相关文章
- 一篇文章学懂Shell脚本
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合.Shell可以直接使用在win/Unix/Linux上面, ...
- 一篇文章学懂Shell脚本,最简明的教程在这里
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. Shell可以直接使用在win/Unix/Linux上面 ...
- 一篇文章图文并茂地带你轻松学完 JavaScript 设计模式(一)
JavaScript 设计模式(一) 本文需要读者至少拥有基础的 ES6 知识,包括 Proxy, Reflect 以及 Generator 函数等. 至于这次为什么分了两篇文章,有损传统以及标题的正 ...
- 一篇文章教你学会ASP.Net Core LINQ基本操作
一篇文章教你学会ASP.Net Core LINQ基本操作 为什么要使用LINQ LINQ中提供了很多集合的扩展方法,配合lambda能简化数据处理. 例如我们想要找出一个IEnumerable< ...
- 一篇文章让你学透Linux系统中的more命令
Linux 下有很多实用工具可以让你在终端界面查看文本文件.其中一个就是 more. more 跟我之前另一篇文章里写到的工具 —— less 很相似.它们之间的主要不同点在于 more 只允许你向前 ...
- 一篇文章图文并茂地带你轻松学完 JavaScript 设计模式(二)
JavaScript 设计模式(二) 本篇文章是 JavaScript 设计模式的第二篇文章,如果没有看过我上篇文章的读者,可以先看完 上篇文章 后再看这篇文章,当然两篇文章并没有过多的依赖性. 5. ...
- js将一篇文章中多个连续的<br>标签替换成两个连续的<br>标签
写本文的目的是今天恰好有一个之前做SEO的同事问我怎样把一篇文章中多个连续的br标签替换成两个连续的br标签,这里就牵涉到SEO层面的问题了. 在做SEO优化的时候,其中有一个需要注意的地方就是尽量减 ...
- 一步一步学Linq to sql(二):DataContext与实体
DataContext DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入 ...
- 一篇文章教你如何用R进行数据挖掘
一篇文章教你如何用R进行数据挖掘 引言 R是一种广泛用于数据分析和统计计算的强大语言,于上世纪90年代开始发展起来.得益于全世界众多 爱好者的无尽努力,大家继而开发出了一种基于R但优于R基本文本编辑器 ...
随机推荐
- day20 project+查看新闻列表 + 点赞 + 图片验证码 + 评论和多级评论 + 后台管理 + webSocket + kindEditor
Day20回顾: 1. 请求生命周期 2. 中间件 md = [ "file_path.classname" ] process_request[可有可无] process_res ...
- oracle数据库简单的导入导出操作
一.数据库导出 1.导出用户名/密码,,导出用户名为test_expdp.导出路径默认为oracle中的dpdump文件中 expdp test_expdp/test_expdp@orcl direc ...
- uva 12356 Army Buddies 树状数组解法 树状数组求加和恰为k的最小项号 难度:1
Nlogonia is fighting a ruthless war against the neighboring country of Cubiconia. The Chief General ...
- 【zznu-夏季队内积分赛3-G】2333
题目描述 “别人总说我瓜,其实我一点也不瓜,大多数时候我都机智的一批“ 宝儿姐考察你一道很简单的题目.给你一个数字串,你能判断有多少个连续子串能整除3吗? 输入 多实例输入,以EOF结尾,每行一个数字 ...
- Draggable拖动
Draggable(拖动)组件 学习要点: 1.加载方式 2.属性列表 3.事件列表 4.方法列表 EasyUI中Draggable(拖动)组件的使用方法,这个组件不依赖于其他组件. 1.加载方式 / ...
- trigger 触发器(mysql)
/* 触发器 tigger 引出触发器: 在进行数据库应用软件的开发的时候,我们有时候会碰到表中的某些数据改变,同事希望引起其他相关数据改变的需求,这时候就需要使用触发器. 运用触发器可以简化程序,增 ...
- shell脚本实例二
练习题一:对已经存在的用户做密码的修改等操作 vim user_ctrl.sh ##进行如下编写 #!/bin/bashShow(){ read -p ...
- PHP中MySQL、MySQLi和PDO的用法和区别【原创】
对于一个初学PHP的自己,对数据库的连接有着很大的疑惑,从Java转到PHP.数据库连接变了,以前只知道JDBC连接数据库,或者直接用框架调用,对于的PHP的数据库连接方式,及其应用.不是很了解,于是 ...
- nginx Linux 开启自启
编辑 /etc/init.d/nginx 添加一下内容 根据路劲修改. 添加可执行权限 chmod +x /etc/init.d/nginx 开启自启 chkconfig nginx on ...
- Windows 64位系统下安装JAVA环境
文件名称:jdk-7u51-windows-x64 下载Windows 64位平台的JDK安装文件. 安装 1.双击打开下载好的文件,点击“下一步”开始安装. 2. ①默认选择安装全部功能,不做调整. ...