LINQ查询表达式

约束

LINQ查询表达式必须以from子句开头,以select或group子句结束

关键字

from...in...:指定要查找的数据以及范围变量,多个from子句则表示从多个数据源查找数据。注意:C#编译器会把"复合from子句"的查询表达式转换为SelectMany()扩展方法

join...in...on...equals...:指定多个数据源的关联方式

let:引入用于存储查询表达式中子表达式结果的范围变量,通常能达到层次感会更好,使代码更易于月的

orderby、descending:指定元素的排序字段和排序方式,当有多个排序字段时,由字段顺序确定主次关系,可指定升序和降序两种排序方式

where:指定元素的筛选条件,多个where子句则表示了并列条件,必须全部都满足才能入选,每个where子句可以使用&&、||连接多个条件表达式

group:指定元素的分组字段

select:指定查询要返回的目标数据,可以指定任何类型,甚至是匿名类型(目前通常被指定为匿名类型)

into:提供一个临时的标识符,该标识符可以引用join、group和select子句的结果。(1)直接出现在join子句之后的into关键字会被翻译为GroupJoin。(2)select或group子句字后的into它会重新开始一个查询,让我们可以继续引入where、orderby和select子句,它是对分步构建查询表达式的一种简写方式。

下面通过一个案例来学习对两张表进行查询

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _013_LINQ {/// <summary>/// 武林高手/// </summary>class MartialArtsMaster {public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public string Menpai { get; set; }public string Kongfu { get; set; }public int Level { get; set; }public override string ToString(){return string.Format("Id: {0}, Name: {1}, Age: {2}, Menpai: {3}, Kongfu: {4}, Level: {5}", Id, Name, Age, Menpai, Kongfu, Level);}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace _013_LINQ {/// <summary>/// 武学/// </summary>class Kongfu {public int Id { get; set; }public string Name { get; set; }public int Power { get; set; }public override string ToString(){return string.Format("Id: {0}, Name: {1}, Power: {2}", Id, Name, Power);}}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;namespace _013_LINQ
{internal class Program{private static void Main(string[] args){//初始化武林高手var masterList = new List<MartialArtsMaster>(){new MartialArtsMaster() {Id = 1, Name = "黄蓉", Age = 18, Menpai = "丐帮", Kongfu = "打狗棒法", Level = 9},new MartialArtsMaster() {Id = 2, Name = "洪七公", Age = 70, Menpai = "丐帮", Kongfu = "打狗棒法", Level = 10},new MartialArtsMaster() {Id = 3, Name = "郭靖", Age = 22, Menpai = "丐帮", Kongfu = "降龙十八掌", Level = 10},new MartialArtsMaster() {Id = 4, Name = "任我行", Age = 50, Menpai = "明教", Kongfu = "葵花宝典", Level = 1},new MartialArtsMaster() {Id = 5, Name = "东方不败", Age = 35, Menpai = "明教", Kongfu = "葵花宝典", Level = 10},new MartialArtsMaster() {Id = 6, Name = "林平之", Age = 23, Menpai = "华山", Kongfu = "葵花宝典", Level = 7},new MartialArtsMaster() {Id = 7, Name = "岳不群", Age = 50, Menpai = "华山", Kongfu = "葵花宝典", Level = 8},new MartialArtsMaster() {Id = 8, Name = "令狐冲", Age = 23, Menpai = "华山", Kongfu = "独孤九剑", Level = 10},new MartialArtsMaster() {Id = 9, Name = "梅超风", Age = 23, Menpai = "桃花岛", Kongfu = "九阴真经", Level = 8},new MartialArtsMaster() {Id = 10, Name = "黄药师", Age = 23, Menpai = "梅花岛", Kongfu = "弹指神通", Level = 10},new MartialArtsMaster() {Id = 11, Name = "风清扬", Age = 23, Menpai = "华山", Kongfu = "独孤九剑", Level = 10}};//初始化武学var kongfuList = new List<Kongfu>(){new Kongfu() {Id = 1, Name = "打狗棒法", Power = 90},new Kongfu() {Id = 2, Name = "降龙十八掌", Power = 95},new Kongfu() {Id = 3, Name = "葵花宝典", Power = 100},new Kongfu() {Id = 4, Name = "独孤九剑", Power = 100},new Kongfu() {Id = 5, Name = "九阴真经", Power = 100},new Kongfu() {Id = 6, Name = "弹指神通", Power = 100}};
}

上面定义了两个类,武林高手和武学,现在我们查询所有武学级别大于8且门派为丐帮的武林高手。

首先我们使用原始的方法来查询:

{var res = new List<MartialArtsMaster>();foreach (var temp in masterList){if (temp.Level > 8 && temp.Menpai == "丐帮"){res.Add(temp);
}

1 使用LINQ查询,表达式写法

            //1,使用LINQ做查询( 表达式写法)var res = from m in masterList//from后面设置查询的集合where m.Level > 8 && m.Menpai == "丐帮"//where后面跟上查询的条件select m;//表示m的结果结合返回

使用LINQ查询,扩展方法的写法。其中Where是过滤操作符,根据返回bool值的Func委托参数过滤元素

        //过滤方法static bool Test1(MartialArtsMaster master){if (master.Level > 8) return true;return false;}//2,扩展方法的写法//var res = masterList.Where(Test1);var res = masterList.Where(m => m.Level > 8 && m.Menpai == "丐帮");

查询结果:

LINQ也可以同时查多个表,下面我们取得所学功夫的杀伤力大于90 的武林高手。

2 LINQ 联合查询

            var res = from m in masterListfrom k in kongfuListwhere m.Kongfu == k.Name && k.Power > 90select m;

LINQ 联合查询,扩展方法用法

            var res =masterList.SelectMany(m => kongfuList, (m, k) => new { master = m, kongfu = k }).Where(x => x.master.Kongfu == x.kongfu.Name && x.kongfu.Power > 90);

查询结果:

3 对查询结果做排序 orderby (descending)

优先等级排序,然后年龄排序

            var res = from m in masterListwhere m.Level > 8 && m.Menpai == "丐帮" //orderby m.Age descending  // 默认从小到大,加上descending从大到小orderby m.Level, m.Age //按照多个字段进行排序,如果字段的属性相同,就按照第二个属性排序select m;//表示m的结果结合返回

排序扩展用法

var res = masterList.Where(m => m.Level > 8 && m.Menpai == "丐帮").OrderBy(m => m.Age);

如果排序判断条件有多个,后面的排序要用ThenBy

var res = masterList.Where(m => m.Level > 8).OrderBy(m => m.Level).ThenBy(m => m.Age);

查询结果:

4 Join on集合联合查询

            var res = from m in masterList// join...in... 表示要连接的表,on后面为连接条件,等于要用equals,不能用==join k in kongfuList on m.Kongfu equals k.Namewhere k.Power > 90select new { master = m, kongfu = k };

查询结果:

5 分组查询 into groups

把武林高手按照所学功夫分类,看一下那个功夫修炼的人数最多

            var res = from k in kongfuListjoin m in masterList on k.Name equals m.Kongfuinto groups   //分组orderby groups.Count()  // 这个可以获得数量select new { kongfu = k, count = groups.Count() };

查询结果:

6 按照自身字段分组 group by

            var res = from m in masterListgroup m by m.Kongfuinto gselect new { count = g.Count(), key = g.Key };//g.Key Key表示是按照那个属性分的组

结果:

7 量词操作符 any all   判断集合中是否满足某个条件

any判断集合中是否有一个满足,all判断集合中是否全部满足

            bool res = masterList.Any(m => m.Menpai == "长留");Console.WriteLine(res);res = masterList.All(m => m.Menpai == "丐帮");Console.WriteLine(res);

结果:

C#编程 LINQ查询相关推荐

  1. LINQ 查询表达式(C# 编程指南)

    LINQ 查询表达式(C# 编程指南) 语言集成查询 (LINQ) 是一组技术的名称,这些技术建立在将查询功能直接集成到 C# 语言(以及 Visual Basic 和可能的任何其他 .NET 语言) ...

  2. linq查询不包含某个值的记录_【翻译】C#表达式中的动态查询

    当您使用LINQ来处理数据库时,这种体验是一种神奇的体验,对吗?你把数据库实体像一个普通的收集,使用Linq中像Where,Select或者 Take,这些简单的使用就能让代码可用了. 但是,让我们考 ...

  3. 视频教程-C#LINQ查询技术-C#

    C#LINQ查询技术 二十多年的企业管理软件开发经历,熟知管理软件的整个开发流程,熟练掌握VFP语言,掌握VB语言,了解JAVA.asp.net.CSS.HTML/HTML5等语言,使用C#语言开发企 ...

  4. 《C# 语言入门详解(刘铁锰) - 学习笔记 - Lambda表达 / Linq查询》

    Lambda表达 / LINQ查询 文章目录 Lambda表达 / LINQ查询 前言 一.Lambda表达式 二.LINQ查询 前言 Lambda表达式: 匿名方法.inline(内联)方法.(简化 ...

  5. Windows Phone本地数据库(SQLCE):11、使用LINQ查询数据库(翻译) (转)

    这是"windows phone mango本地数据库(sqlce)"系列短片文章的第十一篇. 为了让你开始在Windows Phone Mango中使用数据库,这一系列短片文章将 ...

  6. Linq查询语法(2)

    转:http://www.cnblogs.com/knowledgesea/p/3897665.html 1.简单linq查询 //1var ss = from r in db.Am_recProSc ...

  7. asp.net linq查询环境搭建

    本文是以sqlserver2008为数据库,vs2013为开发工具来介绍的. 要搭建这样一个数据库的操作环境,首先建立一个类库项目 然后在这个类库项目中添加几个类:DBDataContext数据库上下 ...

  8. C#使用linq查询大数据集的方法

    这篇文章主要介绍了C#使用linq查询大数据集的方法,涉及C#调用linq进行数据查询的技巧,具有一定参考借鉴价值,需要的朋友可以参考下 using System; using System.Coll ...

  9. C#语法之Linq查询基础一

    Linq做.Net开发的应该都用过,有些地方很复杂的逻辑用Linq很方便的解决.对于Linq to object.Linq to xml.Linq to sql.Linq to Entity(EF)都 ...

最新文章

  1. php加图片源码_PHP添加文字水印或图片水印的水印类完整源代码与使用示例
  2. oracle connection 有时能取到有时候又取不到
  3. PCL:python pcl解码RGB- point_cloud2.read_points rgb
  4. uaa 授权_使用UAA OAuth2授权服务器–客户端和资源
  5. sql查询mysql参数配置_查询参数配置
  6. 信号的采样与恢复matlab实验报告,实验七 连续信号的采样与恢复
  7. 基于鸿蒙Hi3861和华为云平台的烟雾报警器
  8. Kafka的存储设计
  9. 静态库-动态库混合编译
  10. 如何用java更改网页图片,java如何修改文档第一页为不同的页面
  11. linux限制组访问权限,linux用户和组管理以及文件权限访问控制ACL策略
  12. 理解一个名词:用户代理(user agent)
  13. Oracle——distinct的用法
  14. (hdu step 6.3.3)Air Raid(最小路径覆盖:求用最少边把全部的顶点都覆盖)
  15. EasyUI的组件加载两次的问题
  16. php构造方法什么时候使用,php:构造方法的说明详解
  17. python抽学号程序_python:简单的学生管理系统
  18. 投影仪融合、拼接处理系统
  19. Win7添加打印机local port端口拒绝访问的解决方法
  20. 几个生僻字:烎,囧、槑、玊、奣、嘦、勥、巭、嫑、恏、兲、氼、忈、炛

热门文章

  1. 【xlwings api语言参考】Range.RowHeight 属性
  2. 【GAMES104】 游戏中的大地渲染
  3. 【小猫爪】AUTOSAR学习笔记17-AUTOSAR OS
  4. 程序员适不适合创业,无脑崇拜要不得
  5. 酒店忠诚度计划对应等级
  6. Xmind2022 for Ubuntu(一百四十三)
  7. js中将String转成int
  8. 高通新处理器骁龙450曝光 性能不输给骁龙625
  9. 【小工具】一键隐藏/显示MacOS的应用图标
  10. java实现加减乘除法