一、环境搭建

下面将逐步搭建我们学习的环境,这个环境不仅仅是这次需要使用,以后的教程一样需要使用这个环境。所以请大家务必按照

搭建这里的环境否则会影响你后面的学习。

  1. 我们用到的几张表

    通知消息表:

    用户表:

  2. 在VS中生成表

    2.1  新建一个控制台程序(略)

    2.2  新建一个Linq To Sql类

    2.3 新建数据连接

    2.4 添加连接

    2.5 映射表

    环境到此已经设置完毕,后面我们将开始正式的学习

二、操作符学习

  1. 投影操作符

    简单点说就是更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();
    }

    其中我们新建了一个数据模型,然后使用投影,将最终的数据投影成我们新建的数据模型,最终的结果更上面的结果一样。

  2. 限制操作符

    简单说就是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 下面是最终的结果

  3. 排序操作符

    等同于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 下面是结果

  4. 联接操作符

    等同于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. 特殊的联接操作符

    这个操作符可以用来获取两张存在一对多的关系的数据,比如这里用户可以对应多条通知,假如我们需要显示每个用户发送的通知,以一种
    父子的关系来呈现,我们可以用以下的语句来实现。

    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 下面是最终的结果(我可截取了存在通知的用户)

    这里可以看到最终的结果,就是一种从属的关系。

  6. 聚合操作符

    聚合操作符基本都是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. 集合操作符

    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学习之操作符的更多相关文章

  1. LINQ查询操作符 LINQ学习第二篇[转]

    一.投影操作符 1. Select Select操作符对单个序列或集合中的值进行投影.下面的示例中使用select从序列中返回Employee表的所有列: using (NorthwindDataCo ...

  2. LINQ查询操作符 LINQ学习第二篇

    一.投影操作符 1. Select Select操作符对单个序列或集合中的值进行投影.下面的示例中使用select从序列中返回Employee表的所有列: using (NorthwindDataCo ...

  3. Linq学习(一)

    与LINQ有关的语言特性 1.隐式类型 var 2.匿名类型 如:var obj = new {Guid.Empty, myTitle = "匿名类型", myOtherParam ...

  4. Linq学习工具及Lamada表达式

    好东西.转载一个.以备学习 Linq学习工具:     http://www.linqpad.net/ Lamada表达式: Func<int, int, int> IntPow = (x ...

  5. linq学习

    最全的linq学习文章: http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html

  6. (转)Linq学习笔记

    写在前面 最近在看Linq,在博客园看到这篇文章,写的通俗易懂,转来和大家一起做个分享.原文地址http://www.cnblogs.com/goscan/archive/2011/05/05/Lin ...

  7. LINQ标准查询操作符(三)——Aggregate、Average、Distinct、Except、Intersect、Union、Empty、DefaultIfEmpty、Range、Repeat

    七.聚合操作符 聚合函数将在序列上执行特定的计算,并返回单个值,如计算给定序列平均值.最大值等.共有7种LINQ聚合查询操作符:Aggregate.Average.Count.LongCount.Ma ...

  8. C#之Linq学习笔记【转】

    写在前面 其实在09年就已经学习过Linq了,并被她那优美的语法所吸引,只是现在所在的公司还在使用VS2005在.Net2.0的框架下面的开发,所以Linq也很久没有用过了,最近看部门的同事对这个有些 ...

  9. Linq 标准查询操作符三

    本文介绍了LINQ标准查询操作符.没有这些操作符,LINQ就不会存在.本文为理解这些操作符的功能提供了很好的基础.了解它们将会很有帮助,因为LINQ的各种Provider都是基于这些操作符来完成各自丰 ...

随机推荐

  1. eclipse与myeclipse恢复已删除的文件和代码

    1.类文件的恢复 选择项目后右键-->选择Restore from Local history-->出现下面的界面: 勾选后按Restore就恢复了,真的很强大很方便:但我没有就此罢手,我 ...

  2. FireDAC 超时

    FireDAC 超时 Timeout  expired 在Win10 正常. 在Win7 CB的DLL 正常,Delphi的DLL怎么会超时呢??? 果然是连接字符串错了.改为正确的就连接正常了!

  3. 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解

    CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...

  4. 使用nssm在windows服务器上部署nodejs

    Linux上,可以轻松的使用forever或者pm2来部署nodejs应用.但是在windows下就麻烦了,pm2明确的说支持Linux & MacOS,forever在windows下貌似问 ...

  5. Asp.net Page指令

    Page指令为编译器编译页面时使用的指令 指令的格式为 <%@ [Directive] [Attribute=value]%> <%@ Page Language="C#& ...

  6. BigDecimal最基础用法

    BigDecimal最基础用法 用字符串生成的BigDecimal是不会丢精度的. 简单除法. public class DemoBigDecimal { public static void mai ...

  7. sql ltrim rtrim

    sql中用LTRIM ( ),RTRIM ( ).分别截断首尾空格,返回字符表达式. 例1: DECLARE @string_to_trim varchar(60)SET @string_to_tri ...

  8. PHP安装rrdtool扩展

    首先,我的环境是Centos 6.5 PHP版本是5.51.首先安装rrdtool需要的依赖库文件   yum -y install pango* 2.先服务器安装rrdtool  wget http ...

  9. HighChats报表使用C#mvc导出本地图片

    最近工作使用了HighCharts,要用到保存成图片功能,但是是内部使用,不允许连接外网,于是就学习了下highcharts生成本地图片. highcharts有一个exporting.js来负责导出 ...

  10. .net委托(转载)

    一.什么是委托? 委托就是定义一个 对于方法的引用,类似于c++中的函数指针.委托是用来将方法作为参数 传递进入其它方法的, 委托的格式? 修饰符1 delegate  修饰符2  委托类型名(变量n ...