投影是指在将序列中的元素转换为一个自定义形式的操作。投影操作符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);
}

最新文章

  1. nginx+iis、NLB、Web Farm、Web Garden、ARR
  2. 学习SVG系列(3):SVG Stroke属性
  3. java中的传值与传引用
  4. 类似a:hover的伪类的注解
  5. php创建带logo的二维码
  6. Spring 框架理论基础
  7. C#多线程的用法7-线程间的协作ManualResetEvent
  8. [Luogu4074][WC2013]糖果公园
  9. XSS和CSRF的理解
  10. OpenCV——老照片效果
  11. Exchanger兄弟线程间数据信息交换
  12. java继承多态和抽象类接口
  13. C# 5.0 CallerMemberName CallerFilePath CallerLineNumber获取调用方法名称,路径,行号
  14. java后端导入excel模板和导入excel文件去读数据
  15. react 数据管理之state思想指南
  16. 我的一次rsync+inotify本地数据同步示例
  17. 将windows目录共享到linux
  18. jquery ajax跨域解决
  19. 对sql作业的总结(PostgreSQL的递归查询)
  20. 使用C#创建及调用WCF完整实例 (Windows服务宿主)

热门文章

  1. HDU5937 Equation(DFS + 剪枝)
  2. ps教程连接
  3. CODEVS1090 加分二叉树
  4. 干货!IT小伙伴们实用的网站及工具大集合!持续更新!
  5. tungsten抽取和应用mysql binlog
  6. Ansible-playbook批量部署,更新war脚本,可以再完善----后续再update
  7. 《JavaScript Dom编程艺术》(第二版)
  8. Python 爬虫3——第一个爬虫脚本的创建
  9. HDU(1285)—确定比赛名次
  10. WebP 原理和 Android 支持现状介绍(转)