linq是个好东西,让开发人员省时省力。很多人可能只知道怎么使用, 对它没有全面深入的了解。所谓磨刀不误砍柴工,今天就来学习下。

一、与LINQ有关的语言特性

  1.扩展方法

   在System.Linq命名空间内有一个Enumerable的静态类,它实现很多方法,且在任何实现IEnumerable<T>的集合对象都有这些方法,这个技术就是扩展方法。

  要点:1.必须是静态类,名称不能和现有的方法冲突;2.至少要有一个扩展类型输入参数,格式为“ this  [类名] [参数名称]”。

 public static class Enumerable{public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func);}

  2.匿名类型(Anonymous Type)

  以下示例中,其中select new 会自动产生类对象并自动赋值,这个语法包含2个功能:对象初始化器、匿名类型。

var t = from c in db.Productsselect new{Name = c.ProductName,Price = c.UnitPrice};

  new关键字之后就直接为对象定义了属性,并且为这些属性赋值,而且,对象创建出来之后,在创建对象的方法中,还可以畅通无阻的访问对象的属性,在序列化和反序列化JSON对象时很有用。

  当把一个对象的属性拷贝到匿名对象中时,可以不用显示的指定属性的名字,这时原始属性的名字会被“拷贝”到匿名对象中。

  var obj = new {Guid.Empty, myTitle = "匿名类型", myOtherParam = new int[] { 1, 2, 3, 4 } };Console.WriteLine(obj.Empty);//另一个对象的属性名字,被原封不动的拷贝到匿名对象中来了。Console.WriteLine(obj.myTitle);

  限制:1.一般只用在同一函数内,如要外部使用需通过reflection或者动态类型(dynamic);2.只有属性,不可以有方法、事件、字段等;3.初始化只能利用对象初始化器,生成后是只读属性。

  3.对象初始化器(object initializer)

    它允许在程序中通过声明的方式直接给对象属性进行数值初始化,而不必刻意创建带参构造函数。

var myObj1 = new MyObj() { id = Guid.NewGuid(), Title = "allen" };
var myObj1 = new MyObj ("allen") { id = Guid.NewGuid(), Title = "allen" };
var arr = new List<int>() { 1, 2, 3, 4, 5, 6 };

  4.yield指令

    它是一种编译器魔法,编译时会生成迭代运算的有限状态机。状态机监控对象在“巡航”时所做的访问动作,每次巡航调用触发时才真正进入集合获取数据。

    这个机制让对集合对象的访问推迟到真正查询时才触发,这个机制成为延迟查询。

 private static IEnumerable<int> GetCollection1(){List<int> list = new List<int>();for (var i = 1; i <= 5; i++)list.Add(i);return list;}private static IEnumerable<int> GetCollection2(){for (var i = 1; i <= 5; i++){if (i > 3)yield break;elseyield return i;}}

   5.Fulent Interface

Enumerabale 内所包含的LINQ 扩展方法,都返回IEnumerable<T>,这代表可以使用直接串接的方式来调用多个LINQ 函数,而不用为每个函数调用都编写一行程序,这个技术称为Fluent Interface:Fluent Interface 具有三项特性:
  1. 通过调用方法来定义对象内容。
  2. 对象会自我引用(self-referential),且新的对象内容会和最后一个对象内容等价。
  3. 通过返回void 内容(就是null 或不返回最后的对象内容)或非Fluent Interface 的对象结束。
可以直接对集合进行两次过滤:var query=list.Where(c=>c<10000).Where(c=>c>1000);
或是提取需要的数据结构:  var query=list.Where(c=>c<10000).Select(c=>new {id=c});

  6.lambda

二、LINQ基础

  1.linq类型

  LINQ分为四类:LINQ to OBJECTS、LINQ to SQL、LINQ to XML、LINQ to DataSet。

  

   2.简单使用

以下数据源都假设为data

1.获取某列的不重复数据

List<int> ids =  data.Select(t => t.ID).Distinct().ToList();

2.对list进行in查询

List<int> ids = new List<int>() { 1,2,3};
List<Entity>  data = data.Where(tb => ids.Contains(tb.ID)).Select(tb => tb).ToList();

选择指定列

var data = data.Select(t=>new{ t.id,t.name});

转换成字典
var data = data.ToDictionary(key => key.ID, value => value.Name);

3.排序

  OrderBy(s=>s.Name)  正序

  OrderByDescending(s=>s.Name)  倒序

  OrderBy(s=>s.Type).ThenBy(s => s.Name)  联合排序

  OrderByDescending(s=>s.Type).ThenBy(s => s.Name)  联合排序

  OrderBy(s=>s.Type).ThenByDescending(s => s.Name)  联合排序
  OrderByDescending(s=>s.Type).ThenByDescending(s => s.Name)  联合排序

  站内相关:Entity framework中LINQ的使用

参考:

https://www.cnblogs.com/liulun/archive/2013/02/26/2909985.html

https://www.cnblogs.com/long-gengyun/p/3929900.html

http://www.cnblogs.com/xiyin/p/6078385.html

转载于:https://www.cnblogs.com/xcsn/p/5283896.html

c# LINQ 使用相关推荐

  1. ef linq 中判断实体中是否包含某集合

    我有一个需求,问题有很多标签,在查询时,需要筛选包含查询标签的一个集合(List<int>),以前的做法是先查询出来符合查询标签条件的标签id的结果集A,再查询问题时,加上判断是否包含该标 ...

  2. 一.Linq to JSON是用来干什么的?

    Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JSON对象内容比较复杂,而我们仅仅需要其中的一小部分数据时,可以考虑使用Linq to JSON来读取和 ...

  3. LINQ : IEnumerableT and IQueryableT区别

    本地数据源计算机会自动使用IEnumberable<T>,远程数据源会使用IQueryable<T> 下面这条语句没有使用数据库里的EF数据,显示如下: 下面这条语句使用数据库 ...

  4. New LINQ CTP!

    FYI, we just released an updated community preview of our LINQ support for both VB and C#, entitled ...

  5. 转载LINQ优点 自己学习用的

    这几天在读一本LINQ方面的书<Essential LINQ>,在这里和大家分享下. 由于对LINQ的深入总结需要大量的篇幅,因此在这里分成几个部分来讲. (*我看<Essentia ...

  6. 自己动手重新实现LINQ to Objects: 9 - SelectMany

    本文翻译自Jon Skeet的系列博文"Edulinq". 本篇原文地址: http://msmvps.com/blogs/jon_skeet/archive/2010/12/27 ...

  7. 如何查看Linq to SQL运行时,实际执行的Sql语句

    调试Linq to sql代码是, 如果遇到错误,很难判断错误的原因是什么,如果能够输出实际执行的sql原文,对于我们寻找错误的原因有有很大帮助. 以下是我用到的方法: StringBuilder s ...

  8. LINQ to XML 建立,读取,增,删,改

    LINQ to XML的出现使得我们再也不需要使用XMLDocument这样复杂的一个个的没有层次感的添加和删除.LINQ可以使的生成的XML文档在内存中错落有致.下面以一个小的例子说名LINQ to ...

  9. Linq初级班 Linq To XML体验(基础篇)

    LINQ To XML体验(基础) 这两天开始学习LINQ to XML的知识,我会继续把自己的感想和示例发布给初学者们学习的,一样欢迎高手们多多指点,请勿使用过激语言,针锋相对,我是个初学者,自知还 ...

  10. Linq 无法删除尚未附加的实体的问题

    Linq删除个集合数据, 刚开始用的注释掉的那行, 会提示"无法删除尚未附加的实体"错误, 使用Attach方法依然不行. 想想以前用过DeleteAllOnSubmit没啥问题哈 ...

最新文章

  1. Jmeter入门实战(二)如何使用Jmeter的BeanShell断言,把响应数据中的JSON跟数据库中的记录对比...
  2. 1491. [NOI2007]社交网络【最短路计数】
  3. Apache Mahout:适合所有人的可扩展机器学习框架
  4. 微信小程序的setData
  5. 利用react-router实现按需加载、登录验证、刷新组件。。。
  6. 程序员PK律师——瑞幸咖啡战局
  7. Java算法实现 BAT公司为什么要考算法 github
  8. 四川托普计算机学校官网,四川中等职业技术学院
  9. 福田欧曼ETX驱动桥的设计(说明书+8张CAD图纸+开题报告+任务书+中期检查表+答辩相关材料)
  10. php lumen和laravel,Laravel 还是 Lumen?
  11. 【Multisim仿真】74LS47译码器驱动共阳数码管显示(0-8)数字显示
  12. cropper左右移动_cropper封装的头像裁剪尺寸插件
  13. 2022山东理工大学pta程序设计---实验七(函数)题解
  14. CUDA C编程(笔记)——CUDA的异构并行计算
  15. 金仓数据库 KingbaseES SQL 语言参考手册 (11. SQL语句:ABORT 到 ALTER INDEX)
  16. 联想笔记本怎么调出命令提示符_联想笔记本如何进行系统备份?教你通过命令行来解决!...
  17. 《Data Structures and Algorithm Analysis in C》学习与刷题笔记
  18. python自编BP神经网络
  19. 一道关于扔球/扔鸡蛋/摔手机的DP问题(蓝桥杯题目/面试题)
  20. 机械硬盘选购指南——从选购经历谈起

热门文章

  1. 现在大火的Web3是什么 web1 web2
  2. Superset集成到iframe 跨域 无需账号登录
  3. Hyperledger Composer和Hyperledger Fabric的关系、区别及概念
  4. html浏览xsd,XSD 简易元素
  5. 基于SSM的企业OA系统
  6. oracle脑裂的判断机制,Keepalived两节点出现双VIP的情况(脑裂)
  7. 搭建Maven环境及其基本知识
  8. 开局崩盘!IDEA 2020 无法启动的解决办法|赠送 IDEA 2020 新功能
  9. PHP Opcache(ZendOptimizerPlus)的安装配置详解
  10. RocketMQ 常见异常处理