日期:2014-05-20  浏览次数:20954 次

一个简的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,参数的类型而已,你传入相应的参数就行。