本文将讲述LINQ的基础查询(此文所有例子都使用LINQ to Object)

在此之前,我们先创建一个用于示例的数据源:

    • Student类:表示学生,包括学号、姓名及班级
  • Courses类:表示学生选择的课程,包括学号、课程名称及学时数
  • DataCreator类:静态类,通过GenerateData方法产生示例数据
  • 生成的数据如下:

    学号 姓名 班级 课程名称 学时
    003 王五 二班 经济学 20
    003 王五 二班 企业管理 20
    003 王五 二班 财务管理 30
    002 李四 一班 历史 20
    002 李四 一班 政治 20
    002 李四 一班 语文 30
    001 张三 一班 数学 20
    001 张三 一班 语文 20
    001 张三 一班 物理 15

    Main方法中生成数据:

    隐藏行号 复制代码 ? C#
    1. List<Student> students = new List<Student>();
    2. List<Courses> courses = new List<Courses>();
    3. DataCreator.GenerateData(students, courses);

    筛选

    LINQ中通过where子句筛选数据,where子句后跟条件,from后的对象都可作为where子句判断条件的主体。

  • 实际上from .. in ..语句类似于foreach语句,比如

  • from student in students 类似于 foreach(Student student in students)

  • student是students集合中的元素,那么通常在where语句中,可以使用student作为判断的依据,例如:

  • 筛选出一班的所有学生:

  • 隐藏行号 复制代码 ? C#
    1. var query = from student in students
      
    2.             where student.Class == "一班"
      
    3.             select student;
      
    4. foreach (var s in query)
      
    5. {
      
    6.     Console.WriteLine(s);
      
    7. }
      

    筛选学时大于等于20的课程:

  • 隐藏行号 复制代码 ? C#
    1. var query = from course in courses
      
    2.             where course.Credit >= 20
      
    3.             select course;
      

    可使用&&或||来连接多个条件,如筛选出一班姓张的同学:

  • 隐藏行号 复制代码 ? C#
    1. var query = from student in students
      
    2.             where student.Class == "一班" && student.Name.StartsWith("张")
      
    3.             select student;
      

    当然,并不是说条件语句中只能使用from后的对象,它可以使用任何对象作为判断依据(下面LINQ只作演示没实际意义):条件当前时间等于当前时间,此条件永远为真,故会查询出所有的学生资料。

  • 隐藏行号 复制代码 ? C#
    1. var query = from student in students
      
    2.             where DateTime.Now == DateTime.Now
      
    3.             select student;
      
  • 下例以students集合的数量作为判断条件,当stuents的数量大于等于3时筛选出所有学生资料:
  • 隐藏行号 复制代码 ? C#
    1. var query = from student in students
      
    2.             where students.Count>=3
      
    3.             select student;
      

    下例筛选学号存在于ids集合中的学生:

  • 隐藏行号 复制代码 ? C#
    1. String[] ids = {"001","003" };
      
    2. var query = from student in students
      
    3.             where ids.Contains(student.ID)
      
    4.             select student;
      

    查询选修了语文课程的学生资料:

  • 隐藏行号 复制代码 ? C#
    1. var query = from student in students
      
    2.             where (from cours in courses where cours.Name == "语文" select cours.StudentId).Contains(student.ID)
      
    3.             select student;
      
    4. foreach (var s in query)
      
    5. {
      
    6.     Console.WriteLine(s);
      
    7. }
      

    注意上例中使用了嵌套查询,students where语句中包含另一个LINQ语句,该语句从courses集合中返回选修了语文课程的学号,它是一个IEnumerable<String>集合,所以可以在此集合上使用IEnumerable的Contains方法,判断集合中是否包含当前student对象的ID,包含则返回true,即students的where语句为真,该student对象被添加入结果集合,反之不添加。

  • 排序

排序语句比较简单,基本语法为:

orderby .. ascending | descending[, ..ascending | descending]

其中ascending表示升序排列,descending表示降序排列

隐藏行号 复制代码 ? C#
  1. var query = from student in students
    
  2.             orderby student.ID ascending /*descending*/
    
  3.             select student;
    

可根据多个字段进行排序:

隐藏行号 复制代码 ? C#
  1. var query = from student in students
    
  2.             orderby student.ID ascending,student.Name descending
    
  3.             select student;
    

待续…

以下源码产生本文示例数据:

隐藏行号 复制代码 ? C#
  1. using System;
    
  2. using System.Collections.Generic;
    
  3. using System.Linq;
    
  4. using System.Text;
    
  5. namespace LinqStudy
    
  6. {
    
  7.     public static class DataCreator
    
  8.     {
    
  9.         public static void GenerateData(List<Student> students,List<Courses> courses)
    
  10.         {
    
  11.             students.Add(new Student("001","张三", "一班"));
    
  12.             students.Add(new Student("002", "李四", "一班"));
    
  13.             students.Add(new Student("003", "王五", "二班"));
    
  14.             courses.Add(new Courses("001", "数学", 20));
    
  15.             courses.Add(new Courses("001", "语文", 20));
    
  16.             courses.Add(new Courses("001", "物理", 15));
    
  17.             courses.Add(new Courses("002", "历史", 20));
    
  18.             courses.Add(new Courses("002", "政治", 20));
    
  19.             courses.Add(new Courses("002", "语文", 30));
    
  20.             courses.Add(new Courses("003", "经济学", 20));
    
  21.             courses.Add(new Courses("003", "企业管理", 20));
    
  22.             courses.Add(new Courses("003", "财务管理", 30));
    
  23.         }
    
  24.     }
    
  25.     public class Student
    
  26.     {
    
  27.         public String Name { get; set; }
    
  28.         public String Class { get; set; }
    
  29.         public String ID { get; set; }
    
  30.         public Student(String id,String name, String c)
    
  31.         {
    
  32.             ID = id;
    
  33.             Name = name;
    
  34.             Class = c;
    
  35.         }
    
  36.         public override string ToString()
    
  37.         {
    
  38.             return String.Format("学号:{0}\t姓名:{1}\t班级:{2}", this.ID, this.Name, this.Class);
    
  39.         }
    
  40.     }
    
  41.     public class Courses
    
  42.     {
    
  43.         public String Name { get; set; }
    
  44.         public int Credit { get; set; }
    
  45.         public String StudentId { get; set; }
    
  46.         public Courses(String id,String name, int credit)
    
  47.         {
    
  48.             StudentId = id;
    
  49.             Name = name;
    
  50.             Credit = credit;
    
  51.         }
    
  52.         public override string ToString()
    
  53.         {
    
  54.             return String.Format("课程名称:{0}\t学时:{1}", this.Name, this.Credit);
    
  55.         }
    
  56.     }
    
  57. }

[转]Linq语法二的更多相关文章

  1. Linq To Sql中实现Left Join与Inner Join使用Linq语法与lambda表达式

    当前有两个表,sgroup与sgroupuser,两者通过gKey关联,而sgroup表记录的是组,而sgroupuser记录是组中的用户,因此在sgroupuser中不一定有数据.需要使用Left ...

  2. C# LINQ语法详解

    1.简单的linq语法 var ss = from r in db.Am_recProScheme select r; var ss1 = db.Am_recProScheme; string sss ...

  3. LINQ语法详解

    我会通过一些列的实例向大家讲解LINQ的语法. 先创建一个Person类,作为数据实体 public class Person { public string Name { get; set; } p ...

  4. PHP语法(二):数据类型、运算符和函数

    相关链接: PHP语法(一):基础和变量 PHP语法(二):数据类型.运算符和函数 PHP语法(三):控制结构(For循环/If/Switch/While) 这次整理了PHP的数据类型.运算符和函数. ...

  5. Linq语法详细

    闲言碎语 近期比较忙,但还是想写点什么,就分享一些基础的知识给大家看吧,希望能帮助一些linq新手,如果有其它疑问,可以进右上角群,进行交流探讨,谢谢. 开门见山 读这篇文章之前,我先说下,每一种搜索 ...

  6. Linq语法详细(转)

    原文地址:http://www.cnblogs.com/knowledgesea/p/3897665.html 开门见山 读这篇文章之前,我先说下,每一种搜索结果集,我都以三种方式变现出来,为啦更好的 ...

  7. Python 基础语法(二)

    Python 基础语法(二) --------------------------------------------接 Python 基础语法(一) ------------------------ ...

  8. Linq语法

    希望能帮助一些linq新手. 开门见山 读这篇文章之前,我先说下,每一种搜索结果集,我都以三种方式变现出来,为啦更好的理解,希望不要嫌我啰嗦. 1.简单的linq语法 //1 var ss = fro ...

  9. Lamda和Linq语法对比详细

    本人转载:http://www.cnblogs.com/knowledgesea/p/3897665.html 闲言碎语 近期比较忙,但还是想写点什么,就分享一些基础的知识给大家看吧,希望能帮助一些l ...

随机推荐

  1. 正经学C#_变量与其数据类型:《c#入门经典》

    这一篇总结以下变量与其数据类型. 变量:在c#中指 某一个值或者数据存储在变量中,并且可以取出或者查看.变量不仅仅是一种,也有很多种,细分而言就是类型.泛指就是变量.如果是要是使用变量就要 声明变量, ...

  2. GS70 使用 Linux 下面Oracle数据库时 设定 特定目录存储数据文件

    1. 创建目录 mkdir /cwdata 2. 修改目录属性 chown -R oracle:oinstall /cwdata chmod -R /cwdata 效果为: 创建数据库实例时的界面为: ...

  3. Python之运算符以及基本数据类型的object

    一.运算符 1.算术运算符 % 求余运算 **   幂-返回x的y次幂 //   取整数-返回商的整数部分,例:9//2输出结果是4 2.比较运算符 == 等于 != 不等于 <> 不等于 ...

  4. cocos2d 3.3 安装教程

    最近在学习cocos-2d,百度一下cocos-2d,铺天盖地的都是cocos-2dx的教程,不得不说,老外还是钟情cocos2d,之前安装过cocos2d 2.0版本,网上的教程还是都是0.9的安装 ...

  5. [USACO08FEB]酒店Hotel 线段树 BZOJ 1593

    题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...

  6. P3167 [CQOI2014]通配符匹配 题解

    题目 题目大意 给出一个字符串,其中包含两种通配符 ‘?’和 ‘*’ ,‘?’可以代替一个字符,‘*’可以代替一个字符串(长度可以为0) 然后给出几个字符转,判断能否用给出的字符串表示出来 样例解释 ...

  7. pytorch 0.4.1安装问题

    环境 ubuntu 16.04, anaconda3, python 2.7 将pytorch升级为0.4.1后,import torch报错 undefined symbol: _ZN4thpp10 ...

  8. 查看php 相关信息

    PHP系统常量 __FILE__ 当前PHP程序脚本的绝对路径及文件名称 __LINE__ 存储该常量所在的行号 __FUNCTION__ 存储该常量所在的函数名称 __CLASS__ 存储该常量所在 ...

  9. 六度分离 (folyd算法)

    1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为"小世界现象(small world phenomenon)"的著名假说,大意是说,任何2个素不相识的人中间最多只隔着 ...

  10. 华东交通大学2015年ACM“双基”程序设计竞赛1005

    Problem E Time Limit : 3000/2000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Sub ...