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.Products
select new
{
Name = c.ProductName,
Price = c.UnitPrice
};

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

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

  var obj = new {Guid.Empty, myTitle = "匿名类型", myOtherParam = new int[] { , , ,  } };
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>() { , , , , , };

  4.yield指令

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

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

 private static IEnumerable<int> GetCollection1()
{
List<int> list = new List<int>();
for (var i = ; i <= ; i++)
list.Add(i);
return list;
}
private static IEnumerable<int> GetCollection2()
{
for (var i = ; i <= ; i++)
{
if (i > )
yield break;
else
yield 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

c# LINQ 使用的更多相关文章

  1. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  2. Linq之旅:Linq入门详解(Linq to Objects)

    示例代码下载:Linq之旅:Linq入门详解(Linq to Objects) 本博文详细介绍 .NET 3.5 中引入的重要功能:Language Integrated Query(LINQ,语言集 ...

  3. [C#] 走进 LINQ 的世界

    走进 LINQ 的世界 序 在此之前曾发表过三篇关于 LINQ 的随笔: 进阶:<LINQ 标准查询操作概述>(强烈推荐) 技巧:<Linq To Objects - 如何操作字符串 ...

  4. [C#] 进阶 - LINQ 标准查询操作概述

    LINQ 标准查询操作概述 序 “标准查询运算符”是组成语言集成查询 (LINQ) 模式的方法.大多数这些方法都在序列上运行,其中的序列是一个对象,其类型实现了IEnumerable<T> ...

  5. LINQ to SQL语句(7)之Exists/In/Any/All/Contains

    适用场景:用于判断集合中元素,进一步缩小范围. Any 说明:用于判断集合中是否有元素满足某一条件:不延迟.(若条件为空,则集合只要不为空就返回True,否则为False).有2种形式,分别为简单形式 ...

  6. .NET深入实战系列—Linq to Sql进阶

    最近在写代码的过程中用到了Linq查询,在查找资料的过程中发现网上的资料千奇百怪,于是自己整理了一些关于Linq中容易让人困惑的地方. 本文全部代码基于:UserInfo与Class两个表,其中Cla ...

  7. LINQ Group By操作

    在上篇文章 .NET应用程序与数据库交互的若干问题 这篇文章中,讨论了一个计算热门商圈的问题,现在在这里扩展一下,假设我们需要从两张表中统计出热门商圈,这两张表内容如下: 上表是所有政区,商圈中的餐饮 ...

  8. Entity Framework 6 Recipes 2nd Edition(11-9)译 -> 在LINQ中使用规范函数

    11-9. 在LINQ中使用规范函数 问题 想在一个LINQ查询中使用规范函数 解决方案 假设我们已经有一个影片租赁(MovieRental )实体,它保存某个影片什么时候租出及还回来,以及滞纳金等, ...

  9. Entity Framework 6 Recipes 2nd Edition(11-11)译 -> 在LINQ中调用数据库函数

    11-11. 在LINQ中调用数据库函数 问题 相要在一个LINQ 查询中调用数据库函数. 解决方案 假设有一个任命(Appointment )实体模型,如Figure 11-11.所示, 我们想要查 ...

  10. Entity Framework 6 Recipes 2nd Edition(13-6)译 -> 自动编译的LINQ查询

    问题 你想为多次用到的查询提高性能,而且你不想添加额外的编码或配置. 解决方案 假设你有如Figure 13-8 所示的模型 Figure 13-8. A model with an Associat ...

随机推荐

  1. 洛谷 P1691 有重复元素的排列问题 解题报告

    P1691 有重复元素的排列问题 题目描述 设\(R={r_1,r_2,--,r_n}\)是要进行排列的\(n\)个元素.其中元素\(r_1,r_2,--,r_n\)可能相同.使设计一个算法,列出\( ...

  2. numpy 从入门到遗忘

    不常用的函数总是遗忘,很是困扰啊.于是痛下时间,做一个系统的总结,纯原创,都是些实际项目中常用的函数和方法,当然还有一些这边也是没有记录的,因为我在实际数据处理过程中也没有遇到过(如字符串处理等等). ...

  3. 【BZOJ1558】等差数列(线段树)

    [BZOJ1558]等差数列(线段树) 题面 BZOJ 题解 可以说这道题已经非常毒瘤了 怎么考虑询问操作? 如果直接将一段数分解为等差数列? 太麻烦了.... 考虑相邻的数做差, 这样等差数列变为了 ...

  4. MQTT——取消订阅报文和断开连接报文

    笔者已经把连接报文,订阅报文,发布报文都讲解了完了.而接下来就是取消订阅报文和断开连接报文.和其他的报文比较的话,他们显示非常简单.甚至笔者觉得可以不必要拿出来讲.只要看一下MQTT文档就没有什么不清 ...

  5. Deformable ConvNets

    Deformable ConvNets 论文 Deformable Convolutional Networks(arXiv:1703.06211) CNN受限于空间结构,具有较差的旋转不变性,较弱的 ...

  6. php in_array 的一个坑

    in_array('', [0]); // true 因为 php 里面 '' == 0 的结果是 true,这种情况即使 in_array 第三个参数传了 true,还是不能达到想要的效果,只能特殊 ...

  7. Python Machine Learning-Chapter3

    Chapter 3:A Tour of Machine Learning Classifiers Using Scikit-learn 3.1:Training a perceptron via sc ...

  8. Word不能添加目录?

    我复制粘贴了一大把文字,标题也设置了,就是添加不了目录,也不知道是什么原因. 后来同事给我指点了一下,真是万分感激啊 比如下面这张图,第13章那么大的标题在那里,但是就是添加不了目录 原因是在于换行的 ...

  9. Linux命令之rm

    rm命令 用处:删除文件 用法:在终端上输入rm加上要删除的文件的名字(如果有的话,包括后缀) 示例: (我要删除newfile这个文件)

  10. 常用的css文件

    reset.css(几乎每个项目都要引入的css) @charset "utf-8";html{background-color:#fff;color:#000;font-size ...