投影是指在将序列中的元素转换为一个自定义形式的操作。投影操作符Select和SelectMany用于选择出赋予了适当功能的值。SelectMany操作符可以处理多个集合。

  LINQ表达式语法:

1. Select

  Select操作符对单个序列或集合中的值进行投影。

1.1 原型定义

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, int, TResult> selector);

1.2 查询表达式

int[] fibonacci = new int[] { , , , , , , ,  };
var result = from f in fibonacci
select f; foreach (var item in result)
{
Console.WriteLine(item);
}
IEnumerable<int>
source = new int[] { , , , , , , , },
filtered = source.Where(f => f > ),
sorted = filtered.OrderBy(f => f),
query = sorted.Select(f => f * );
List<int> list = new List<int>() { , , , ,  };
var query = from number in list
where number <
select number;

3>. 扩展方法

int[] fibonacci = new int[] { , , , , , , ,  };
var result = fibonacci.Select(f => f); foreach (var item in result)
{
Console.WriteLine(item);
}
Object[] arr = new Object[] { "String", , true, 10.0m, 'a' };
var types = arr.Select(item => item.GetType().Name); foreach (var type in types)
{
Console.WriteLine(type);
}

4>. 查询返回列

  Select可以从序列中查询返回全部列、单独列及指定的多列。

  返回单列:

using (NorthwindContext context = new NorthwindContext())
{
var products = from p in context.Products
select p.ProductName;
}
var products = context.Products
.Select(p => p.ProductName);
// using System.IO;
DirectoryInfo di = new DirectoryInfo(@"D:\");
var query = from dir in di.GetDirectories()
orderby dir.Name
select dir.Name;

  返回多列:

var products = from p in context.Products
select new { p.ProductID, p.ProductName };
var products = context.Products
.Select(p => new { p.ProductID, p.ProductName });
int[] fibonacci = new int[] { , , , , , ,  };
var expr = fibonacci.Select((f, i) => new { Index = i, Number = f });
foreach (var item in expr)
{
Console.WriteLine(item.Index + "-" + item.Number);
}
var expr = context.Products
.OrderBy(p => p.ProductID)
.Select(p => new ProductViewModel
{
ProductID = p.ProductID,
ProductName = p.ProductName,
UnitPrice = p.UnitPrice
});
var expr = context.Products
.Select(p => new
{
ProductID = p.ProductID,
ProductName = p.ProductName,
Available = p.UnitsInStock - p.UnitsOnOrder > ? "In Stock" : "Out Of Stock"
});
var expr = context.Products
.Select(p => new
{
ProductID = p.ProductID,
ProductName = p.ProductName,
Units = new
{
p.UnitsInStock,
p.UnitsOnOrder,
Available = p.UnitsInStock - p.UnitsOnOrder > ? "In Stock" : "Out Of Stock"
}
});
var query = context.Products
.Select((p, index) => new
{
Position = index,
p.ProductName,
p.UnitPrice
});

5>. Select方法实现

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
{
foreach (TSource element in source)
{
yield return selector(element);
}
}

2. SelectMany

  SelectMany操作符可以将多个from字句组合起来,将每个对象的结果合并成一个序列。

1>. 原型定义

public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);
public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(this IEnumerable<TSource> source, Func<TSource, int, IEnumerable<TCollection>> collectionSelector, Func<TSource, TCollection, TResult> resultSelector);

2>. 返回全部列

var expr = from c in context.Customers
from o in c.Orders
select o;
var expr = context.Customers
.SelectMany(c => c.Orders);

3>. 返回指定列

var expr = from c in context.Customers
from o in c.Orders
select new { o.OrderID, o.OrderDate };
var expr = context.Customers
.SelectMany(c => c.Orders
.Select(o => new { o.OrderID, o.OrderDate }));
var query = context.Categories
.Where(c => c.CategoryID == )
.SelectMany(c => c.Products
.Where(p => p.CategoryID == c.CategoryID)
.Select(p => new
{
c.CategoryName,
p.ProductName,
p.UnitPrice
})
);
var expr = from c in context.Categories
from p in c.Products
where c.CategoryName == "LINQ to Object"
select p;
var query = from c in context.Categories
select new
{
CategoryID = c.CategoryID,
CategoryName = c.CategoryName,
ProductIDs = from p in c.Products
select p.ProductID
};
var expr = from c in context.Categories
from p in c.Products
select new
{
c.CategoryName,
p.ProductID,
p.ProductName
}; var expr = from c in
context.Categories
.SelectMany(c => from p in c.Products
select new
{
c.CategoryName,
p.ProductID,
p.ProductName
})
select c; var expr = context.Categories
.SelectMany(c => c.Products
.Select(p => new
{
c.CategoryName,
p.ProductID,
p.ProductName
}));

3. Let

var expr = from p in context.Products
let productInfo = p.UnitPrice + "," + p.UnitsInStock
select new { p.ProductName, productInfo };
var expr = context.Products
.Select(p => new { p, ProductInfo = p.UnitPrice + "," + p.UnitsInStock })
.Select(t => new { t.p.ProductName, t.ProductInfo }); foreach (var item in expr)
{
Console.WriteLine("{0}-{1}", item.ProductName, item.ProductInfo);
}

LINQ系列:Linq to Object投影操作符的更多相关文章

  1. LINQ系列目录

    1. LINQ准备 1.1 C#中与LINQ相关特性 2. LINQ to Object 2.1 LINQ to Object投影操作符(Select/SelectMany/Let) 2.2 LINQ ...

  2. C# ~ 从 XML 到 Linq 到 Linq to XML

    .XML 可扩展标记语言 (Extensible Markup Language), 标记 (markup) 是关键部分,是标准通用标记语言 (Standard Generalized Markup ...

  3. LINQ系列:Linq to Object集合操作符

    集合操作符对元素的集合或序列集合进行操作,并返回一个集合.LINQ共有4种集合查询操作符:Distinct.Union.Intersect和Except. 1. Distinct Distinct操作 ...

  4. LinQ系列文章

    温故而知新,想着系统再学习一次LinQ知识点,发现园子里有个非常棒的系列文章,所以Mark下来,方便以后查阅! 系列博客导航: LINQ之路系列博客导航 LINQ之路 1:LINQ介绍 LINQ之路 ...

  5. LINQ 系列

    C#图解教程 第十九章 LINQ   LINQ 什么是LINQLINQ提供程序 匿名类型 方法语法和查询语法查询变量查询表达式的结构 from子句join子句什么是联结查询主体中的from…let…w ...

  6. Linq系列

    LINQ 图解 Linq中的Select——投影 Linq学习资源 Expert C# 5.0中的Linq部分

  7. C# LINQ系列:LINQ to DataSet的DataTable操作 及 DataTable与Linq相互转换

    LINQ to DataSet需要使用System.Core.dll.System.Data.dll和System.Data.DataSetExtensions.dll,在项目中添加引用System. ...

  8. LINQ之LINQ to Objects(上)

    LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. 1.LINQ体系结构 从上图可以看出,L ...

  9. Linq之Linq to Sql

    目录 写在前面 系列文章 Linq to sql 总结 写在前面 上篇文章介绍了linq to xml的相关内容,linq to xml提供一种更便捷的创建xml树,及查询的途径.这篇文章将继续介绍l ...

随机推荐

  1. CATransition(os开发之画面切换) 的简单用法

    CATransition 的简单用法 //引进CATransition 时要添加包“QuartzCore.framework”,然后引进“#import <QuartzCore/QuartzCo ...

  2. weex image

    weex 的image用来渲染图片, 可以使用img作为它的别名. 需要注意的是,他的长度可宽度必须指定, 不然它是不会工作的. 它没有任何的子组件. 有两个属性: src 用来指定图片的地址图片. ...

  3. Java_类似java.lang.VerifyError: Expecting a stackmap frame at branch target 22 in method的解决方法

    报异常的方法内使用了Java 7的新特性:自动资源释放,类似于try(){},即在try后面跟一括号,在括号里面对一些资源赋值,try里面的代码块执行完毕之后会自动释放try后面的括号中声明的资源. ...

  4. 多线程、委托、Invoke解决winform界面卡死的问题,并带开关

    一.知识点介绍 1,更新控件的内容,应该调用控件的Invoke方法. Invoke指: 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托.该方法接收一个委托类型和委托的参数,因此需要定义 ...

  5. Code of Conduct

    v

  6. php清理当前目录下的指定文件和空目录(源码),建议服务器端执行

    <?php /** * @desc 解析当前目录并递归删除目录下的指定文件 * @author mengdj<mengdj@outlook.com> 2014.10.02 1530 ...

  7. jasmine入门

    本文来自http://blog.fens.me/nodejs-jasmine-bdd 粉丝日志 张丹   前言TDD(Test Driven Development)测试驱动开发,是敏捷开发中提出的最 ...

  8. 深入理解javascript系列(4):立即调用的函数表达式

    本文来自汤姆大叔 前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下“自执行”这个叫法,本文对这个功能的叫法 ...

  9. Java 集合类的特性

    ArrayList: 元素单个,效率高,多用于查询  Vector: 元素单个,线程安全,多用于查询 LinkedList: 元素单个,多用于插入和删除  HashMap: 元素成对,元素可为空  H ...

  10. ajax 全套

    ajax简介 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.Ajax不是一种新的编程语言, ...