Linq学习之操作符
一、环境搭建
下面将逐步搭建我们学习的环境,这个环境不仅仅是这次需要使用,以后的教程一样需要使用这个环境。所以请大家务必按照
搭建这里的环境否则会影响你后面的学习。
我们用到的几张表
通知消息表:
用户表:
在VS中生成表
2.1 新建一个控制台程序(略)
2.2 新建一个Linq To Sql类
2.3 新建数据连接
2.4 添加连接
2.5 映射表
环境到此已经设置完毕,后面我们将开始正式的学习
二、操作符学习
投影操作符
简单点说就是更SQL语句中的 AS 操作符一个意思,就是把列名换掉。但是我们这里的投影远比SQL语句中的AS
拥有更强大的地方。1.1.1 下面是一个简单的投影使用
static void Main(string[] args)
{
LinqDataDataContext dc = new LinqDataDataContext();
var result = from item in dc.Db_SST_Notic
select new { NID = item.NoticID, NTitle = item.NoticTitle };
//这里使用 new 将 NoticID 的列名改为 NID,将 NoticTitle 的列名改为 NTitle
//最后的result就会
foreach (var item in result)
{
System.Console.WriteLine(" ID = {0}; Title = {1} ", item.NID, item.NTitle);
}
System.Console.ReadKey();
}1.1.2 最后遍历result的时候,item中除了集成自Object的基本方法以外,就是投影的属性名如图:
1.1.3 这是最后的结果(数据根本个人情况会不一样)
1.2.1 下面来演示一个较复杂的
//新建的一个数据模型
class Modal
{
public int NID { get; set; }
public String NTitle { get; set; }
} static void Main(string[] args)
{
LinqDataDataContext dc = new LinqDataDataContext();
//将最终结果投影成我们自己数据模型
IEnumerable<Modal> result = from item in dc.Db_SST_Notic
select new Modal()
{
NID = item.NoticID,
NTitle = item.NoticTitle
};
//这里使用 new 将 NoticID 的列名改为 NID,将 NoticTitle 的列名改为 NTitle
//最后的result就会
foreach (var item in result)
{
System.Console.WriteLine(" ID = {0}; Title = {1} ", item.NID, item.NTitle);
}
System.Console.ReadKey();
}其中我们新建了一个数据模型,然后使用投影,将最终的数据投影成我们新建的数据模型,最终的结果更上面的结果一样。
限制操作符
简单说就是SQL语句中的where,就是用来对数据进行筛选。
2.1 下面是一个用来获得重要通知的语法
static void Main(string[] args)
{
LinqDataDataContext dc = new LinqDataDataContext();
//将最终结果投影成我们自己数据模型
var result = from item in dc.Db_SST_Notic
where item.IsMust.Value
select new
{
NID = item.NoticID,
NTitle = item.NoticTitle
};
foreach (var item in result)
{
System.Console.WriteLine(" ID = {0}; Title = {1} ", item.NID, item.NTitle);
}
System.Console.ReadKey();
}其中的 where item.IsMust.Value 就是用来将重要的通知从中筛选出来
2.2 下面是最终的结果
排序操作符
等同于SQL语句中的orderby
3.1 下面是一个按通知ID逆序,并且按发送时间正序的语法
static void Main(string[] args)
{
LinqDataDataContext dc = new LinqDataDataContext();
var result = from item in dc.Db_SST_Notic
where item.IsMust.Value
orderby item.NoticID descending,item.SendTime
select new
{
NID = item.NoticID,
NTitle = item.NoticTitle
};
foreach (var item in result)
{
System.Console.WriteLine(" ID = {0}; Title = {1} ", item.NID, item.NTitle);
}
System.Console.ReadKey();
}通过上面的 orderby item.NoticID descending,item.SendTime 就可以将数据进行排序
3.2 下面是结果
联接操作符
等同于SQL语句中的inner join
4.1 下面是一个将通知表与用户表进行关联的语句
static void Main(string[] args)
{
LinqDataDataContext dc = new LinqDataDataContext();
var result = from item in dc.Db_SST_Notic
join user in dc.Sys_SST_User on item.SendNoticUserID equals user.UserID
where item.IsMust.Value
orderby item.NoticID descending, item.SendTime
select new
{
NID = item.NoticID,
NTitle = item.NoticTitle,
User = user.UserName
};
foreach (var item in result)
{
System.Console.WriteLine(" ID = {0}; Title = {1}; User = {2} ", item.NID, item.NTitle,item.User);
}
System.Console.ReadKey();
}其中join 后面跟着的 user in dc.Sys_SST_User 就是获取用户表的集合,后面的 on item.SendNoticUserID equals user.UserID 就是关联
的条件,这样就可以将用于表与通知表进行关联了,然后注意最后的投影,我们多了一个 User = user.UserName 这样我们就可以在最后的结果
中看到发送该通知的用户。4.2 下面是最后的结果
特殊的联接操作符
这个操作符可以用来获取两张存在一对多的关系的数据,比如这里用户可以对应多条通知,假如我们需要显示每个用户发送的通知,以一种
父子的关系来呈现,我们可以用以下的语句来实现。5.1
static void Main(string[] args)
{
LinqDataDataContext dc = new LinqDataDataContext();
//var result = from item in dc.Db_SST_Notic
// join user in dc.Sys_SST_User on item.SendNoticUserID equals user.UserID
// where item.IsMust.Value
// orderby item.NoticID descending, item.SendTime
// select new
// {
// NID = item.NoticID,
// NTitle = item.NoticTitle,
// User = user.UserName
// };
var result = dc.Sys_SST_User.GroupJoin(dc.Db_SST_Notic, user => user.UserID, notic => notic.SendNoticUserID, (user, notic) =>
new { UserID = user.UserID, Name = user.UserName, notics = notic.Select(n => n.NoticTitle) });
foreach (var item in result)
{
System.Console.WriteLine(" UserID = {0} ; Name = {1} ", item.UserID,item.Name);
foreach (string subitem in item.notics)
{
System.Console.WriteLine(" Title = {0} ", subitem);
}
}
System.Console.ReadKey();
}其中 GroupJoin 的第一个参数是需要联接的表,第二个参数是 Sys_SST_User 的条件字段(用来和第三个参数进行对比),第三个参数是
第一个参数表中的条件字段(用来与第二个参数进行对比),最后的参数就是在将两个表中的条件进行对比后的结果,其中user参数表示一个
用户数据,而notic表示的是多个通知,这里我们就可以使用投影来获取我们需要的数据。5.2 下面是最终的结果(我可截取了存在通知的用户)
这里可以看到最终的结果,就是一种从属的关系。
聚合操作符
聚合操作符基本都是SQL语句中的MAX、MIN、COUNT、AVERAGE等
6.1 Aggregate操作符
它的功能就是将上一次的结算结果作为执行函数的第一个参数,将当前处理的数据作为第二个参数,并且把返回的参数作为
下一个执行方法的第一个参数。
6.1.1 下面是一个累加的实现int[] s = new int[] { , , , , , , , , };
var result = (from item in s
select item).Aggregate(
(ct, nt) => { return ct + nt; });
System.Console.WriteLine(" NIDADD = {0} ", result);这里我要说明一下,为什么我们这里是对一个数组的数据进行操作,而不是之前对一个集合,因为集合是不支持单一的循环的
当然你在SQL语句中可能用过游标,而游标的实现方式就是面对行而不是集合。6.1.2 下面是结果
6.2 Average操作符
它的功能就是求结果的平均值
6.2.1 下面我们举一个求通知ID的平均值
LinqDataDataContext dc = new LinqDataDataContext();
var result = (from item in dc.Db_SST_Notic
select item.NoticID).Average();
System.Console.WriteLine(" Average is {0}", result);6.2.2 下面是最终的结果
6.3 Count操作符
它的功能就是求结束的数量
6.3.1 下面是输出通知的总数
LinqDataDataContext dc = new LinqDataDataContext();
var result = (from item in dc.Db_SST_Notic
select item.NoticID).Count();
System.Console.WriteLine(" Count is {0}", result);6.3.2 下面是最终结果
提示下Count操作符只能返回不超过Int32能够表示的数量范围。如果数据量会超过Int32所能表示的范围,可以使用下面
介绍的操作符。6.4 LongCount操作符
6.4.1 下面是输出通知的总数
LinqDataDataContext dc = new LinqDataDataContext();
var result = (from item in dc.Db_SST_Notic
select item.NoticID).LongCount();
System.Console.WriteLine(" Count is {0}", result);6.4.2 最终结果同上
6.5 Max操作符
它的功能就是求结果数据中最大的一条数据6.5.1 下面是求通知ID中的最大ID
LinqDataDataContext dc = new LinqDataDataContext();
var result = (from item in dc.Db_SST_Notic
select item.NoticID).Max();
System.Console.WriteLine(" Count is {0}", result);6.5.2 下面是最终结果
6.6 Min操作符
它的功能就是求结果数据中最小的一条数据6.6.1 下面是输出通知ID中最小的ID
LinqDataDataContext dc = new LinqDataDataContext();
var result = (from item in dc.Db_SST_Notic
select item.NoticID).Min();
System.Console.WriteLine(" Max is {0}", result);6.6.2 下面是最终结果
集合操作符
7.1 Distinct操作符
用于去除结果中重复的值7.1.1 下面是用来获取已经发送通知的用户ID
用于通知可以由一个用户发送多个,所以直接搜索就会出现重复。LinqDataDataContext dc = new LinqDataDataContext();
var result = (from item in dc.Db_SST_Notic
select item.SendNoticUserID).Distinct();
foreach (var item in result)
{
System.Console.WriteLine(" UserID = {0} ", item.Value);
}
System.Console.ReadKey();7.1.2 下面最后的结果
7.2 Union操作符
用于将两个结果集合并但是不会显示重复的数据
7.2.1 下面我们新建两个数组然后进行合并int[] i1 = new int[] {,, };
int[] i2 = new int[] { , , , , , , };
LinqDataDataContext dc = new LinqDataDataContext();
var result = i1.Union(i2);
foreach (var item in result)
{
System.Console.WriteLine(" UserID = {0} ", item);
}
System.Console.ReadKey();7.2.2 下面是最终的结果
7.3 Intersect操作符
用于返回两个集合中都存在的数据
7.3.1 下面我们继续使用上面的数据然后改变为交集int[] i1 = new int[] {,, };
int[] i2 = new int[] { , , , , , , };
LinqDataDataContext dc = new LinqDataDataContext();
var result = i1.Intersect(i2);
foreach (var item in result)
{
System.Console.WriteLine(" UserID = {0} ", item);
}
System.Console.ReadKey();7.3.2 下面是最终的结果
7.4 Except操作符
它的功能与Intersect操作符刚好相反,它是将在两个集合中没有同时存在的值返回7.4.1 下面我们继续使用上面的数据然后改变方式为差集
int[] i1 = new int[] {,, };
int[] i2 = new int[] { , , , , , , };
LinqDataDataContext dc = new LinqDataDataContext();
var result = i2.Except(i1);
foreach (var item in result)
{
System.Console.WriteLine(" UserID = {0} ", item);
}
System.Console.ReadKey();7.4.2 下面是最终结果
Linq学习之操作符的更多相关文章
- LINQ查询操作符 LINQ学习第二篇[转]
一.投影操作符 1. Select Select操作符对单个序列或集合中的值进行投影.下面的示例中使用select从序列中返回Employee表的所有列: using (NorthwindDataCo ...
- LINQ查询操作符 LINQ学习第二篇
一.投影操作符 1. Select Select操作符对单个序列或集合中的值进行投影.下面的示例中使用select从序列中返回Employee表的所有列: using (NorthwindDataCo ...
- Linq学习(一)
与LINQ有关的语言特性 1.隐式类型 var 2.匿名类型 如:var obj = new {Guid.Empty, myTitle = "匿名类型", myOtherParam ...
- Linq学习工具及Lamada表达式
好东西.转载一个.以备学习 Linq学习工具: http://www.linqpad.net/ Lamada表达式: Func<int, int, int> IntPow = (x ...
- linq学习
最全的linq学习文章: http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html
- (转)Linq学习笔记
写在前面 最近在看Linq,在博客园看到这篇文章,写的通俗易懂,转来和大家一起做个分享.原文地址http://www.cnblogs.com/goscan/archive/2011/05/05/Lin ...
- LINQ标准查询操作符(三)——Aggregate、Average、Distinct、Except、Intersect、Union、Empty、DefaultIfEmpty、Range、Repeat
七.聚合操作符 聚合函数将在序列上执行特定的计算,并返回单个值,如计算给定序列平均值.最大值等.共有7种LINQ聚合查询操作符:Aggregate.Average.Count.LongCount.Ma ...
- C#之Linq学习笔记【转】
写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...
- Linq 标准查询操作符三
本文介绍了LINQ标准查询操作符.没有这些操作符,LINQ就不会存在.本文为理解这些操作符的功能提供了很好的基础.了解它们将会很有帮助,因为LINQ的各种Provider都是基于这些操作符来完成各自丰 ...
随机推荐
- python之fabric(一):环境env
原文:https://my.oschina.net/indestiny/blog/289587 1. fabric有很多可配置的环境,如: user:默认用于ssh登录的本地用户名. password ...
- 基于WDF的PCI/PCIe接口卡Windows驱动程序(4)- 驱动程序代码(源文件)
原文出处:http://www.cnblogs.com/jacklu/p/4687325.html 本篇文章将对PCIe驱动程序的源文件代码作详细解释与说明.整个WDF驱动程序工程共包含4个头文件(已 ...
- C++中四种转换类型的区别
一.四种转换类型比较: 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可 ...
- C++中 容易忽视的const 修饰符
C++可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多的有点: (1)const常量有数据类型,而宏常量没有数据类型.编译器可以对const进行类型安全检查,而后者只进行 ...
- IntelliJ IDEA13.1.3+Scala2.11.1环境搭建
fesh个人实践,欢迎经验交流!本文Blog地址:http://www.cnblogs.com/fesh/p/3805611.html Intellij IDEA的使用性非常好,是一个非常优秀的IDE ...
- iOS开发-Alcatraz插件管理
CocoaPod负责iOS开发中的引用类库的管理,Alcatraz中文翻译阿尔卡特拉斯岛,也有人称之为恶魔岛,主要是负责管理第三方Xcode 插件.模版以及颜色配置的工具,直接集成到 Xcode 的图 ...
- Intellij_idea-14官方快捷键中文版
编辑类: Ctrl+Space 基本代码实例(类.方法.变量) Ctrl + Shift + Space 智能代码实例(根据需要的类型过滤方法和变量) Ctrl + Shift + Enter 完整的 ...
- [原创]Matlab之GUI生成EXE文件
近期因为项目需要,简化流程,写了一些Matlab程序,并配备上了GUI界面使其简单易用.然后问题来了,可移植性.使用Matlab生成EXE文件(可以封装很多的function),然后在一台安装有Mat ...
- POJ 1236-Network of Schools (图论-有向图强联通tarjan)
题目链接:http://poj.org/problem?id=1236 题目大意:N(2<N<100)个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输.问题 ...
- Revenge of Nim hdu 4994 (博弈)
http://acm.split.hdu.edu.cn/showproblem.php?pid=4994 题意:现在有两个人在取石子,共有n堆石子,每堆石子取完后才可以取下一堆石子,最后一个取石子的人 ...