好久之前就想系统的学习下LINQ,好久之前……

本篇文章主要介绍LINQ等的标准查询操作符,内容取自《LINQ高级编程》,后续还会介绍LINQ to XML ,LINQ to SQL。

LINQ入门教程之各种标准查询操作符(一)

LINQ入门教程之各种标准查询操作符(二)

进入正题

(一)先介绍下标准查询操作符的概念

它是一系列方法的集合,如常见的Select 、Where、OrderBy等,这些方法作用于序列(集合)之上,序列是一个实现了IEnumerable<T>接口或IQueryable<T>接口的类型的对象。

IEnumerable和IQueryable的一个区别是:IEnumerable接口提供了向前遍历的功能。它不具备在各个数据项之间移动(向前移动除外)的能力。IQueryalbe可以使查询操作更具灵活性。

通俗的讲查询操作符是用好linq的基本,就像砍材要用的刀一样……

(二)另外再说下 查询语法和方法语法的概念

查询语法 即用查询表达式来编写查询。 如代码:

 int[] data={,,,};
IEnumerable<int> query = from da in data where da > select da;

那方法语法呢 如代码:

 int[] data={,,,};
IEnumerable<int> query2 = data.Select(o => o).Where(d => d > );

LINQ在编译的时候,查询语法将会转为方法语法。相对而言,查询语法更容易阅读、理解和维护

(三)各种查询操作符汇总列表

标准查询操作符 (方法语法)  查询表达式(查询语法)
 All(Of T)  N/A
 Any  N/A
Average   N/A
Cast(Of T)   An explicit range of variables
Count  N/A
Distinct   N/A
GroupBy   group by
GroupJoin   join…in…on…into
Join   join…in…on…equals…
LongCount   N/A
Max   N/A
Min   N/A
OrderBy  order by
OrderByDescending   order by descending
Select   select
SelectMany   Multiple from clauses
Skip   N/A
SkipWhile   N/A
Sum   N/A
Take   N/A
TakeWhile    N/A
ThenBy       order by
ThenByDescending   order by descending
Where   where

备注:N/A (Not Applicable 不适用的)

(四) 下面主要通过代码来讲解各个标准查询操作符。

1.  投影操作符 (Select  SelectMany)

   #region  投影操作符 将序列中的元素转换为一个由开发人员定义的形式的操作
/// <summary>
/// 对单个序列或集合中的值进行投影
/// </summary>
static void SelectFunction()
{
DataContext contexts = new DataContext("Initial Catalog=AdventureWorks; Integrated Security=true");
Table<Contact> contacts = contexts.GetTable<Contact>();
//查询语法
var query = from c in contacts where c.FirstName == "gong" select new { c.FirstName };
//方法语法
query = contacts.Select(o => new { o.FirstName }).Where(c => c.FirstName == "gong");
foreach (var item in query)
{
Console.WriteLine(item.FirstName);
}
}
//output:
//Gong
//Gong
class name{ public List<string> pets; public string FirstName;}
/// <summary>
/// selectMany 提供了将多个from子句组合起来的功能,它将每个对象的结果合并成单个序列
/// </summary>
static void SelectManyFunction( )
{
//List<name> list =new List<name>() {
name[] list =new name[] {
new name{ FirstName="Gwt",pets=new List<string>{"TEST"} } ,
new name{ FirstName="Gwt1",pets=new List<string>{"TEST4","Test41"} },
};
//将所有List<string> 合并
IEnumerable<string> query = list.SelectMany(own => own.pets);
foreach (string item in query)
{
Console.Write(item +" ");
}
Console.WriteLine("");
//下面这个循环等于上面的seletmany方法
var query2 = list.Select(own => own.pets);
foreach (var item in query2)
{
foreach (var item2 in item)
{
Console.Write(item2+" ");
}
}
}
//output:
// TEST TEST4 TEST41
// TEST TEST4 TEST41

2.  限制操作符 (Where)

     #region  限制操作符
/// <summary>
/// where操作符不启动查询的执行,当开始对对象进行枚举时查询才开始执行
/// </summary>
static void WhereFunction()
{
int[] numbers = { ,,,,,};
IEnumerable<int> query = numbers.Select(o => o).Where(o => o > );
foreach (int item in query)
{
Console.Write(item+" ");
}
}
//output;
//4 5 6
#endregion

3.  排序操作符 (OrderBy OrderByDescending ThenBy ThenByDescending Reverse)

      #region  排序操作符
/// <summary>
/// OrderBy/OrderByDescending 对应提供了按照升序/降序的方式对结果进行排序的功能
/// ThenBy/ThenByDescending 实现按照次关键字对序列进行升序/降序排列
/// </summary>
static void OrderByFunction()
{
DataContext context = new DataContext(StaticData.ConnectSql);
Table<Contact> contacts = context.GetTable<Contact>( );
IEnumerable<Contact> query = contacts.Select(o => o).OrderBy(o => o.FirstName).ThenBy(o => o.LastName); foreach (Contact item in query)
{
Console.WriteLine(item.FirstName + " " + item.LastName);
}
Console.WriteLine();
query = contacts.Select(o => o).OrderByDescending(o => o.FirstName).ThenByDescending(o => o.LastName);
foreach (Contact item in query)
{
Console.WriteLine(item.FirstName + " " + item.LastName);
}
}
//output:
//Gong tao
//Gong taos
//gong2 tao2
//gong3 tao3
//gong4 tao4
//gong5 tao5
//
//gong5 tao5
//gong4 tao4
//gong3 tao3
//gong2 tao2
//Gong taos
//Gong tao
/// <summary>
/// Reverse 把数据源的数据按相反的顺序返回
/// </summary>
static void ReverseFunction()
{
int[] numbers = { ,,,,};
IEnumerable<int> query = numbers.Reverse();
foreach (int item in query)
{
Console.Write(item+" ");
}
}
//output:
//5 4 3 2 1
#endregion

4.  联接操作符 (Join GroupJoin)

   #region  联接操作符
/// <summary>
/// join 相当于T-SQL中的inner join
/// </summary>
static void JoinFunction()
{
DataContext context = new DataContext(StaticData.ConnectSql);
Table<Contact> contact = context.GetTable<Contact>();
Table<Employee> employee = context.GetTable<Employee>();
//方法语法
var query = contact.Join(employee, con => con.ContactID, emp => emp.ContactID,
(con, emp) => new { ContactName = con.FirstName, emp })
.Where(con=>con.ContactName=="gong2");
//查询语法
query = from con in contact
join emp in employee on con.ContactID equals emp.ContactID
where con.FirstName=="gong2"
select new { ContactName = con.FirstName, emp } ;
foreach (var item in query)
{
Console.WriteLine(item.ContactName + " " + item.emp.EmployeeID);
}
}
//output:
//gong2 23
//gong2 24
//gong2 25
//gong2 26
class Team
{
public string TeamName;
}
class Rider
{
public string Name;
public string TeamName;
}
/// <summary>
/// GroupJoin
/// </summary>
static void GroupJoinFunction()
{
List<Team> teams = new List<Team>{new Team{ TeamName="t1"}
,new Team{TeamName="t2"}
,new Team{TeamName="t3"}
};
List<Rider> riders = new List<Rider> {
new Rider{Name="r1",TeamName="t1"},
new Rider{Name="r2",TeamName="t1"},
new Rider{Name="r3",TeamName="t2"},
new Rider{Name="r4",TeamName="t2"},
new Rider{Name="r5",TeamName="t3"},
new Rider{Name="r6",TeamName="t3"},
};
//方法语法
var query = teams.GroupJoin(riders, t => t.TeamName, r => r.TeamName,
(t, r) => new { teamname = t.TeamName, ridernames = r.Select(o => o.Name) });
foreach (var item in query)
{
Console.WriteLine(item.teamname);
foreach (var item2 in item.ridernames)
{
Console.WriteLine(" "+item2);
}
}
}
//output:
//t1
// r1
// r2
//t2
// r3
// r4
//t3
// r5
// r6
#endregion

5.  分组操作符 (GroupBy)

 #region  分组操作符  根据一个特定的值(选择器) 将序列中的值或元素进行分组
/// <summary>
///
/// </summary>
static void GroupByFunction()
{
DataContext context = new DataContext(StaticData.ConnectSql);
Table<SalesOrderHeader> orders = context.GetTable<SalesOrderHeader>();
//按照每个销售人员对订单进行分组
var query = orders.Where(o => o.SalesPersonID > ).GroupBy(order => order.SalesPersonID, order => order.CustomerID); foreach (var item in query)
{
Console.WriteLine(item.Key);
foreach (var item2 in item)
{
Console.WriteLine(" " + item2);
}
}
}
#endregion

6.  串联操作符 (Concat)

  #region  串联操作符
/// <summary>
/// 串联操作符 Concat 【将两个集合合并成一个集合】
/// </summary>
static void ConcatFunction( )
{
DataContext context = new DataContext(StaticData.ConnectSql);
Table<Contact> contacts = context.GetTable<Contact>( );
Table<SalesOrderHeader> orders = context.GetTable<SalesOrderHeader>();
//将Contact表的Firstname和SalesOrderHeader的CustomerID串联起来
var query = contacts.Select(con => con.FirstName).Concat(orders.Select(order => order.CustomerID.ToString()));
foreach (var item in query)
{
Console.WriteLine(item.ToString());
}
}
#endregion

LINQ入门教程之各种标准查询操作符(二)

动动您的手指,点下支持,您的支持是我最大动力!

LINQ入门教程之各种标准查询操作符(一)的更多相关文章

  1. LINQ入门教程之各种标准查询操作符(二)

    续上篇LINQ入门教程之各种标准查询操作符(一) LINQ入门教程之各种标准查询操作符(二) 7.  聚合操作符 8.  集合操作符 9.  生成操作符 #region 生成操作符 即从现有序列的值中 ...

  2. LINQ标准查询操作符详解(转)

     一. 关于LINQ       LINQ 英文全称是“Language-Integrated Query”,中文为“语言集成查询”,它是微软首席架构师.Delphi 之父和C# 之父——Anders ...

  3. Linq to BBJECT之非延时标准查询操作符

    非延时标准查询操作符是指不具备延时查询特性的标准查询操作符,这些操作符一般用于辅助延时标准查询操作符使用. 1.ToArray操作符 ToArray操作符用于将一个输入序列转换成一个数组. 方法原型: ...

  4. Linq to OBJECT延时标准查询操作符

    1.Where 操作符用于限定输入集合中的元素,将符合条件的元素组织声称一个序列结果.2.Select  操作符用于根据输入序列中的元素创建相应的输出序列中的元素,输出序列中的元素类型可以与输入序列中 ...

  5. Linq 标准查询操作符三

    本文介绍了LINQ标准查询操作符.没有这些操作符,LINQ就不会存在.本文为理解这些操作符的功能提供了很好的基础.了解它们将会很有帮助,因为LINQ的各种Provider都是基于这些操作符来完成各自丰 ...

  6. LINQ 标准查询操作符

    本文介绍了LINQ标准查询操作符.没有这些操作符,LINQ就不会存在.本文为理解这些操作符的功能提供了很好的基础.了解它们将会很有帮助,因为LINQ的各种Provider都是基于这些操作符来完成各自丰 ...

  7. Linq to Object 延迟标准查询操作符

    1.Where 操作符用于限定输入集合中的元素,将符合条件的元素组织声称一个序列结果.2.Select  操作符用于根据输入序列中的元素创建相应的输出序列中的元素,输出序列中的元素类型可以与输入序列中 ...

  8. Linq to Object之非延迟标准查询操作符

    非延时标准查询操作符是指不具备延时查询特性的标准查询操作符,这些操作符一般用于辅助延时标准查询操作符使用. 1.ToArray操作符 ToArray操作符用于将一个输入序列转换成一个数组. 方法原型: ...

  9. Elasticsearch入门教程(五):Elasticsearch查询(一)

    原文:Elasticsearch入门教程(五):Elasticsearch查询(一) 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:h ...

随机推荐

  1. asp.net core 1.1 mysqlsugarCore mysql.data 要 7.0.5.0

    Message=Could not load file or assembly 'MySql.Data, Version=7.0.5.0, Culture=neutral, PublicKeyToke ...

  2. Mybatis的map用法

    当Mybatis传过来的值是map类型的时候,有两种处理方法 1.将数值装入类封装起来 public interface IStudentDao { // 根据姓名和年龄查询 List<Stud ...

  3. MySQL性能调优与架构设计——第1章 MySQL 基本介绍

    第1章 MySQL 基本介绍 前言:作为最为流行的开源数据库软件之一, MySQL 数据库软件已经是广为人知了. 但是为了照顾对MySQL还不熟悉的读者,这章我们将对 MySQL 做一个简单的介绍.主 ...

  4. tomcat下manager配置

    1 安装Tomcat前需要先安装JDK.安装Tomcat后测试Tomcat成功安装. Tomcat Manager是Tomcat自带的.用于对Tomcat自身以及部署在Tomcat上的应用进行管理的w ...

  5. 通过一个例子感受C# 6.0新特性

    微软在Visual Studio 2015中更新C#语言到6.0,添加了很多很好的特性,以使C#语言继续跻身于最优秀语言之行列.下面通过一个例子快速感受一下C# 6.0的新特性,以下程序在VS2015 ...

  6. C# Aes CryptoStream Specified padding mode is not valid for this algorithm的解決方法

    //解密數據            using (var ss = File.OpenRead(@"d:\qq.d.flac"))            {             ...

  7. solr特点三: 基于Solr实现排序定制化参考

    排序实现有N种形式,最低成本.最快响应时间是目标 一份索引,支持N种排序策略并且在线互不干扰是要考虑的每一种实现,处理的场景是不同的,不要千篇一律 020排序,从索引到效果,有不少坑,这篇文章没有细说 ...

  8. C# 实用小类

    /// <summary> /// 汉字转换拼音 /// </summary> /// <param name="PinYin"></pa ...

  9. WPF:MVVM模式下ViewModel关闭View

    不外乎两种基本方法. 消息通知和参数传递. 一.消息通知 利用View里的IsEnable属性 原理是这样的: 1.UI中的IsEnabled绑定VM中的属性 2.UI的后台代码中,注册IsEnabl ...

  10. Sql语法高级应用之五:使用存储过程实现对明细多层次统计

    前言 前面章节我们讲到了存储过程的基础用法,本章则将一个在项目中实际应用的场景. 在项目中经常会存在这样的需求,例如需要对明细列表进行按组.按级别.按人等进行统计,如果在附带列表的查询条件,又如何实现 ...