读书人

一个简的Linq加lamda表达式查询操作

发布时间: 2013-09-28 10:01:20 作者: rapoo

一个简的Linq加lamda表达式查询操作,我思考很久,请高手帮助

关于LINQ和ladama 几乎没有书讲他们详细的语法,我用的时候都是似懂非懂,有的比较简单查询
比如:
var query6 = CustomerList.SelectMany(c => c.Orders);

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

我是这样理解,c=>c.orders 
=>前面的c 代表 Func<TSource, IEnumerable<TResult>> selector)里面的TSource  
=>后面的c.orders代表 Func<TSource, IEnumerable<TResult>> selector)里面的IEnumerable<TResult>>

selector
但是下面这个查询我实在推测不出来是什么意思,不是我没看书,我下载了三本关于LINQ的书都没讲
语法基础 就是讲到lamda只讲lamda , 当查询操作符里使用lamda时,都没讲语法,就是讲,
也是一笔带过,对于一些稍复杂的情况,我实在揣摩不透语法的意思
如下查询:请高手详细讲解下语法
query7 = from c in CustomerList.SelectMany(o => OrderList, (c, o) => new { c, o })
where (c.c.Country == "USA") && (c.o.CustomerID == c.c.CustomerID)
select new { c.o, c.c };



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


我想,那个o=>OrdeList  是Func<TSource, IEnumerable<TCollection>>
不就是 public delegate TResult Func<T, TResult>(T arg);  但是o能是TSource吗,能是T吗
上面的语法我实在是费解,请高手帮忙仔细解释下
[解决办法]
就比如你的第一句:

var query6 = CustomerList.SelectMany(c => c.Orders);


理论上应该是和下边的查询是等价的:
var query6= from c in CustomerList
from o on c.Orders
select o;

[解决办法]
1、2、3的理解 是对的。
归根结底 是对委托的理解, SelecMany传递的是一个委托(是把 一个方法传递进去),SelecMany内部会使用该委托。SelecMany 的参数 要什么类型 就构造什么类型,跟普通的方法一样。
假设 menthod(int i) 这个方法,
调用 method(1) 或者 把1 先声明 int b=1;method(b);SelecMany是不是 一样。
Func<Customer, Enumerable<Order>> 相当于 类型 int,参数的类型而已,你传入相应的参数就行。

读书人网 >.NET

热点推荐