Linq查询操作之投影操作
投影操作,乍一看不知道在说啥。那么什么是投影操作呢?其实就是Select操作,名字起的怪怪的。和Linq查询表达式中的select操作是一样的。它能够选择数据源中的元素,并指定元素的表现形式。投影操作包括以下2种操作:
1、Select操作,将数据源中的元素投影到新的序列中,并指定元素的类型和表现形式。
2、SelectMany操作,也可以将数据源中的元素投影到新的序列中,并指定元素的类型和表现形式。但该操作可以将该函数应用到多个序列之上,并将结果合并成一个序列。
下面我们逐一看一下这两个操作。
Select操作
Select操作,将数据源中的元素投影到新的序列中,并指定元素的类型和表现形式。和Linq查询表达式中的select操作相似。Select操作将一个函数应用到一个序列上,并产生一个新的序列。Enumerable的Select()原型如下:
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
其中source表示数据源,selector表示映射元素的转换函数。TSource指定参数类型,TResult指定selector函数的返回值类型。
下面我们创建一个整型数组ints,包含10个元素。使用select来计算每个元素除以5的余数。
private void SlectQuery()
{
int[] ints = new int[]; for (int i = ; i < ; i++) ints[i] = i; //查询数据
var result = ints.Select(x => x%); foreach (var item in result)
{
Response.Write(item+"</br>");
}
}
我们看看输出结果:
SelectMany操作
SelectMany和Select比较相似,主要区别是可以将一个函数应用到多个序列上,并将结果合并成一个新的序列。Enumerable的SelectMany()操作的原型如下:
public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector);
public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TResult>> selector);
public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);
public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);
source表示数据源,selector表示映射元素的转换函数。collectionSelector表示映射元素的转换函数的集合。下面我们来做个具体实例来看一看.
1.创建两个整型数组intA,intB。他们的值分别是{1,2,3},{4,5,6},
2、创建一个List<int[]>的序列,并将intA和intB数组添加到该序列中。
3、使用SelectMany操作List<int[]>序列
我们先用Select操作:
private void SlectManyQuery()
{
int[] intsA = new int[] {,,};
int[] intsB = new int[] { , ,}; IList<int[]> lst = new List<int[]>(); lst.Add(intsA); lst.Add(intsB); //查询数据
var result = lst.Select(x=>x); foreach (var item in result)
{
Response.Write(item+"</br>");
}
}
看下结果:
我们现在用SelectMany操作:
private void SlectManyQuery()
{
int[] intsA = new int[] {,,};
int[] intsB = new int[] { , ,}; IList<int[]> lst = new List<int[]>(); lst.Add(intsA); lst.Add(intsB); //查询数据
var result = lst.SelectMany(x=>x); foreach (var item in result)
{
Response.Write(item+"</br>");
}
}
看看操作结果:
我们看到Select操作只是对List对象进行操作,而SelectMany是对List<int[]>中的每一项操作最后合并成一个新的结果集。
我们可以通过源码开对比:
Select操作最终调用的迭代器:

我们可以看出它只对数据源进行一次foreach迭代。
SelectMany操作:

SelectMany操作,可以看出首先进行foreach迭代,在迭代里面再对数据集的每一项进行一个foreach迭代。所以SelectMany能够对多个序列进行操作后合并结果。
Linq查询操作之投影操作的更多相关文章
- Trident中的解析包含的函数操作与投影操作
一:函数操作 1.介绍 Tuple本身是不可变的 Function只是在原有的基础上追加新的tuple 2.说明 如果原来的字段是log,flag 新增之后的tuple可以访问这些字段,log,fla ...
- C#3.0新增功能09 LINQ 基础04 基本 LINQ 查询操作
连载目录 [已更新最新开发文章,点击查看详细] 本篇介绍 LINQ 查询表达式和一些在查询中执行的典型操作. 获取数据源 在 LINQ 查询中,第一步是指定数据源. 和大多数编程语言相同,在使用 ...
- Linq查询操作之排序操作
在Linq中排序操作可以按照一个或多个关键字对序列进行排序.其中第一个排序关键字为主要关键字,第二个排序关键字为次要关键字.Linq排序操作共包含以下5个基本的操作. 1.OrderBy操作,根据排序 ...
- Linq查询操作之Where筛选
筛选操作where能够处理逻辑运算符组成的逻辑表达式.比如逻辑“与”,逻辑“或”,并从数据源中筛选数据,它和where子句的功能非常相似.Enumerable类的Where()原型如下: public ...
- Linq查询操作之聚合操作(count,max,min,sum,average,aggregate,longcount)
在Linq中有一些这样的操作,根据集合计算某一单一值,比如集合的最大值,最小值,平均值等等.Linq中包含7种操作,这7种操作被称作聚合操作. 1.Count操作,计算序列中元素的个数,或者计算满足一 ...
- Linq对XML的简单操作
前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...
- LINQ to SQL更新数据库操作(转载)
使用LINQ to SQL建模Northwind数据库 在这之前一起学过LINQ to SQL设计器的使用,下面就使用如下的数据模型: 当使用LINQ to SQL设计器设计以上定义的五个类(Prod ...
- 转载Entity Framework 5.0(EF first)中的添加,删除,修改,查询,状态跟踪操作
转载原出处:http://www.cnblogs.com/kenshincui/p/3345586.html Entity Framework将概念模型中定义的实体和关系映射到数据源,利用实体框架可以 ...
- C# LINQ系列:LINQ to DataSet的DataTable操作 及 DataTable与Linq相互转换
LINQ to DataSet需要使用System.Core.dll.System.Data.dll和System.Data.DataSetExtensions.dll,在项目中添加引用System. ...
随机推荐
- db2 ha create dependency failed 解决
db2diag.log 2014-10-16-23.27.55.009490-240 E31979E444 LEVEL: ErrorPID : 6651 TID : 140508206864160 P ...
- Why GUID primary keys are a database’s worst nightmare
http://csharptest.net/1250/why-guid-primary-keys-are-a-databases-worst-nightmare/ When you ask most ...
- 构造函数和:this()的应用
一.构造函数和:this()的应用 //本实例演示构造函数和:this()的应用 public class ClsA { public string A{set;get;} public string ...
- 博为iHospital-HIS医院信息系统产品系列
博为软件iHospital-HIS产品系列式面向大中型医院应用的完整医院流程信息化产品,覆盖了医院主要的业务流程,管理职能,和病人在医院诊疗的各个环节.将医院流程的优化与软件系统完美结合,为建立数字化 ...
- WP-PostViews的安装和设置方法
wordpress本身并没有文章浏览统计功能,必须借助插件.想要知道自己的文章被多数访客浏览,或者访客对哪些文章或者哪类文章更加有兴趣,这就是文章统计的重要性了.WP-PostViews插件是哥不错的 ...
- struts2:数据校验,通过Action中的validate()方法实现校验(续:多业务方法时的不同验证处理)
前文:struts2:数据校验,通过Action中的validate()方法实现校验,图解 如果定义的Action中存在多个逻辑处理方法,且不同的处理逻辑可能需要不同的校验规则,在这种情况下,就需要通 ...
- 【总结】编写自己的JDBC框架
一.数据库连接池: 在一般用JDBC 进行连接数据库进行CRUD操作时,每一次都会: 通过:java.sql.Connection conn = DriverManager.getConnection ...
- List的遍历和删除元素
package test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public c ...
- shell 复习
grep -v zip$ -v 逻辑否 $以zip结尾 (^开头) -n str不空,-z str 空
- Oracle---.oracle函数
数值型函数: 绝对值: ABS(x) [功能]返回x的绝对值 [参数]x,数字型表达式 [返回]数字 [示例] select abs(100),abs(-100) from dual;-------- ...