c#中LINQ的基本用法实例

一、什么是LINQ

LINQ(读音link)代表语言集成查询(Language Integrated Query),是.NEt框架的扩展,它允许我们用SQL查询数据库的方式来查询数据的集合,使用它,你可以从数据库、程序对象的集合以及XML文档中查询数据

下面一个简单的示例,可以查询数组中小于8的数字并输出。

一般步骤:获取数据源、创建查询、执行查询。需要注意的是,尽管查询在语句中定义,但直到最后的foreach语句请求其结果的时候才会执行

using System;
using System.Collections.Generic;
using System.Linq;

namespace LINK查询
{
 class Program
 {
 static void Main(string[] args)
 {
  int[] number = { 2, 4, 6, 8, 10 }; //获取数据源
  IEnumerable<int> lowNum = from n in number //创建并存储查询,不会执行操作
     where n < 8
     select n;

  foreach(var val in lowNum) //执行查询
  {
  Console.Write("{0} ", val);
  }

  Console.ReadKey();
 }
 }
}

二、查询表达式的结构

查询表达式由查询体后的from子句组成,其子句必须按一定的顺序出现,并且from子句和select子句这两部分是必须的。先介绍一下子句

2.1 from子句

from子句指定了要作为数据源使用的数据集合,它的语法是:

from Type Item in Items

其中Type是集合中元素的类型,是可选的,因为编译器可以从集合来推断类型。  Item是迭代变量的名字。  Items是要查询的集合的名字,必须是可枚举类型的

它和foreach比较相似,但foreach语句在遇到代码时就执行其主体,二from子句什么也不执行。它创建可以执行的后台代码对象,只有在程序的控制流遇到访问查询变量的语句时才会执行

2.2  join子句

如果您对SQL中的join比较熟悉的话,那么LINQ中的join对你来说也不是什么难事,不熟悉的话,,当我没说。

我们可以使用join来结合两个或更多集合中的数据,它接受两个集合然后创建一个临时的对象集合

var query = from s in students
  join c in course on s.SID equals c.SID

equals用于比较相等性的字段,不能使用“==”代替,下面示例中有三个学生和三门课程,我们要做的是查找选修了历史课的学生名

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LINK查询
{
 class Program
 {
 public class Student //声明student类
 {
  public int stId; //学生ID
  public string stuName; //学生姓名
 }

 public class Course //声明course类
 {
  public int stId; //学生ID
  public string courseName; //课程名
 }

 static Student[] students = new Student[]
 {
  new Student {stId = 1,stuName = "jack"},
  new Student {stId = 2,stuName = "taylor"},
  new Student {stId = 3,stuName = "fleming"}
 };

 static Course[] courses = new Course[]
 {
  new Course{stId = 1,courseName = "art"},
  new Course{stId = 2, courseName = "art"},
  new Course{stId = 1,courseName = "history"},
  new Course{stId = 3, courseName = "history"},
  new Course{stId = 3,courseName = "physics"},
 };

 static void Main(string[] args)
 {
  //查询所有选修了history课的学生名
  var query = from s in students
   join c in courses on s.stId equals c.stId
   where c.courseName == "history"
   select s.stuName;

  foreach(string str in query)
  {
  Console.Write("{0} ", str);
  }
  Console.ReadKey();
 }
 }
}

输出 jack fleming

讲解一下查询过程:它会依次使用student中的对象与course中的所有对象进行对比,查找是否符合 s.stId equals c.stId where c.courseName == "history" 要求。

stID stuName
1 jack
2 taylor
3 fleming
 stID  courseName
 1  art
 2  art
 1  history
 3  history
 3  physics

即先将(1,jack)和(1,art),(2,art)...(3,physics)分别匹配,然后再(2,taylor)和(1,art),(2,art)...(3,physics),直到所有都匹配完,最终可以找到两条可以匹配的结果

2.3 let子句

let子句接受一个表达式的运算并且把它赋值给一个需要在其他运算中使用的标识符,它是from...let...where片段中的一部分

var query = from a in groupA
   from b in groupB
   let sum = a + b
   where sum < 12
   select new(a,b,sum);

2.4 where子句

where子句根据之后的运算来除去不符合要求的项,一个查询表达式可以有任意多个where子句,一个项必须满足所有的where条件才能避免被过滤,其语法为

where BoolenExpression1
where BoolenExpression2

前面的例子已经多次用过where,这里就不举例了

2.5 orderby子句

orderby可以很方便的将返回的数据进行排序,可选ascending和descending两种方式,默认的是ascending

语法: orderby Expression ascending or descending 二选一

为join子句中的例子增加一个orderby子句,返回结果就变成了 fleming jack

var query = from s in students
      join c in courses on s.stId equals c.stId
      where c.courseName == "history"
               orderby s.stuName  //排序
      select s.stuName; 

2.6 group子句

group子句可以让你把select的结果按指定的键(key)进行分组 ,每一个分组由一个叫做键的字段区分,分组本身是可枚举类型的并且可以枚举它的项

var query = from student in students
   group student by student.major;

   foreach (var s in query)
   {
    Console.WriteLine("{0}", s.key);
    foreach (var t in s)
    {
     console.writeLine(" {0}", t.Name);
    }
   }

2.7 select子句

select子句指定所选定的对象哪部分应该被选择。可以指定下面的任意一项

a: 整个数据项

b: 数据项的一个字段

c: 数据项中几个字段组成的新对象(或类似其他值)

var query = from s in students
      select s; //整个数据项

   var query = from s in students
      select s.stuName; //s中的一个字段

   var query = from a in groupA
      from b in groupB
      let sum = a + b
      where sum < 12
      select new (a, b, sum);  //a,b,sum组成的新字段

2.8 查询延续: into子句

查询延续子句可以接受查询的一部分结构并赋予一个名字,从而可以在查询的另一部分中使用

var someInt = from a in groupA
    from b in groupB
    into groupAandB
    from c in groupAandB
    select c;

三、方法语法和查询语法

在使用LINQ写查询时可以使用两种形式的语法:查询语法和方法语法

  a:方法语法(method syntax) : 使用标准的方法调用,这些方法是一组叫做标准查询运算符的方法

  b:查询语法(query method) : 看上去和SQL语句很相似,使用查询表达式形式书写。微软推荐使用查询语法,因为它更易读

在编译时,CLR会将查询语法转换为方法语法

int[] num = { 2, 4, 6, 8, 10 };

 var numQuery = from number in num //查询语法
    where number < 8
    select number;

 var numMethod = num.Where(x => x < 8); //方法语法

它们得到的结果是一样的。方法语法中where的参数使用了Lambda表达式

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • C#基于Linq和反射实现数据持久化框架Xml4DB详解

    我们知道目前大部分的数据库都是关系型数据库, 所谓关系型数据库,就是指建立在关系模型 基础之上的数据库系统,如Oracle.SQL Server.Access.MySQL等.关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织.一个偶然的机会我接触到了DB4O,它是一个完全面向对象的开源数据库,它的出现完全颠覆了传统的数据库在人们心中的形象,因为传统的数据库需要在数据体.实体之间转换,而且需要映射文件提供映射关系.正是这个项目让我产生了编写Xml4DB的想

  • C#中LINQ多条件JOIN时为什么可以使用匿名类

    前言 本文主要介绍的是关于C#中LINQ多条件JOIN时为什么可以使用匿名类的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 我们先来看一下linq中如何在join中指定多个条件 public ActionResult Edit(int id) { using (DataContext db = new DataContext(ConfigurationManager.ConnectionStrings["sqlConnection"].ConnectionS

  • c# linq的差集,并集,交集,去重代码(分享)

    如下所示: using System.Linq; List<string> ListA = new List<string>(); List<string> ListB = new List<string>(); List<string> ListResult = new List<string>(); ListResult = ListA.Distinct().ToList();//去重 ListResult = ListA.Exc

  • C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串的方法

    在工作中,如果需要跟XML打交道,难免会遇到需要把一个类型集合转换成XML格式的情况.之前的方法比较笨拙,需要给不同的类型,各自写一个转换的函数.但是后来接触反射后,就知道可以利用反射去读取一个类型的所有成员,也就意味着可以替不同的类型,创建更通用的方法.这个例子是这样做的:利用反射,读取一个类型的所有属性,然后再把属性转换成XML元素的属性或者子元素.下面注释比较完整,就话不多说了,有需要看代码吧! using System; using System.Collections.Generic;

  • c#中LINQ的基本用法实例

    一.什么是LINQ LINQ(读音link)代表语言集成查询(Language Integrated Query),是.NEt框架的扩展,它允许我们用SQL查询数据库的方式来查询数据的集合,使用它,你可以从数据库.程序对象的集合以及XML文档中查询数据 下面一个简单的示例,可以查询数组中小于8的数字并输出. 一般步骤:获取数据源.创建查询.执行查询.需要注意的是,尽管查询在语句中定义,但直到最后的foreach语句请求其结果的时候才会执行 using System; using System.C

  • Sql Server中Substring函数的用法实例解析

    SQL 中的 substring 函数是用来抓出一个栏位资料中的其中一部分.这个函数的名称在不同的资料库中不完全一样: MySQL: SUBSTR( ), SUBSTRING( ) Oracle: SUBSTR( ) SQL Server: SUBSTRING( ) SQL 中的 substring 函数是用来截取一个栏位资料中的其中一部分. 例如,我们需要将字符串'abdcsef'中的'abd'给提取出来,则可用substring 来实现: select substring('abdcsef'

  • java中静态导入机制用法实例详解

    java中静态导入机制用法实例详解 这里主要讲解了如何使用Java中静态机制的用法,这里提供了简单实例大家可以参考下. 静态常量类 在java开发中,我们会经常用到一些静态常量用于状态判断等操作.为了能够在多个地方复用这些常量,通常每个模块都会加一个常量类,举个简单的列子: import com.sky.OrderMouleConsstants; /** * Created by gantianxing on 2017/4/21. */ public class Test { public vo

  • c#中LINQ的基本用法(三)

    一.并行LINQ System.Linq名称空间中包含的类ParallelEnumerable可以分解查询的工作,使其分布在多个线程上.尽管Enumerable类给IEnumerable<T>接口定义了扩展方法,但ParallelEnumerable类的大多数扩展方法是ParallerQuery<TSource>类的扩展.例如,AsParallel()方法,它扩展了IEnumerable<T>接口,返回ParallelQuery<T>类,所以正常的集合类可以

  • c#中LINQ的基本用法(二)

    目录 1.筛选 2.用索引筛选 3.类型筛选 4.复合的from子句 5.排序 6.分组 7.对嵌套的对象分组 8.内连接 9.左连接 10.组连接 11.集合操作 12.合并 13.分区 14.聚合操作符 15.转换操作符 16.生成操作符 本文主要介绍LINQ查询操作符 LINQ查询为最常用的操作符定义了一个声明语法.还有许多查询操作符可用于Enumerable类.下面的例子需要用到LINQ基础(一)(https://www.jb51.net/article/244208.htm)的一些代码

  • c#中LINQ的基本用法(一)

    LINQ(Language Integrated Query,语言集成查询),在C#语言中集成了查询语法,可以用相同的语法访问不同的数据源.LINQ提供了不同数据源的抽象层,所以可以使用相同的语法.这里主要介绍LINQ的核心原理和C#中支持C# LINQ查询的语言扩展. 1.语法 使用LINQ查询出来自巴西的所以世界冠军.这里可以使用List<T>类的FindAll()方法,但使用LINQ查询语法更简单 static void LINQQuery() { // var query = from

  • Python中np.linalg.norm()用法实例总结

    目录 前言 用法 总结 前言 np.linalg.norm()用于求范数,linalg本意为linear(线性) + algebra(代数),norm则表示范数. 用法 np.linalg.norm(x, ord=None, axis=None, keepdims=False) 1.x: 表示矩阵(一维数据也是可以的~) 2.ord: 表示范数类型 向量的范数: 矩阵的向量: ord=1:表示求列和的最大值 ord=2:|λE-ATA|=0,求特征值,然后求最大特征值得算术平方根 ord=∞:表

  • C#中JavaScriptSerializer帮助类用法实例

    本文实例讲述了C#中JavaScriptSerializer帮助类用法.分享给大家供大家参考.具体如下: 关键代码如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Text.RegularExpressions; using System.Web.Script.Serialization; namespace YanZhiwei.DotNet3._5.Utilities.Common {    

  • C#中while循环语句用法实例详解

    本文实例讲述了C#中while循环语句用法.分享给大家供大家参考.具体实现方法如下: 在C#中while循环是我们经常会用到的一种循环语句,while循环特点是直到条件为零时才跳出循环,当然中间可以利用其它函数直接跳出,对于while的具体用法有必要做一个较为详尽的分析. 先来说Foreach和For的区别,Foreach是针对对象进行遍历的,不需要定义循环次数,但是有个缺点,Foreach遍历取的是只读数据,不能在Foreach中进行对象的增删改,而For循环就可以.这个改成while循环的代

  • JQuery中基础过滤选择器用法实例分析

    本文实例讲述了JQuery中基础过滤选择器用法.分享给大家供大家参考.具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <he

随机推荐