Linq基础

其实Linq对象的查询,是在以前的语法上加以封装而已。加上一些where和select 等方法,为了达到对象的查询,对象去实现了IEnumerable接口,实现的对象的迭代。例如

IEnumerable<string> query=from s in names where s.length==5 orderby s select s.ToUpper();

等同于:

IEnumerable<string> query=names.Where(s=>s.Length==5)

                                            .OrderBy(s=>s)

                                             .Select(s=>s.ToUpper());       

 where等红色关键字传递的是Func(谓语委托),where(Func<T, TResult> 委托)所以参数也可以说Lambada表达式。

‍‍
用扩展方法来构造Linq的where等方法

例如下面:

namespace System.Linq{

public static class Enumerable{

    public static IEnumerable<T>  where<T>(this IEnumerable<T> source,Func<T,bool> predicate){//扩展了IEnumerable对象的方法,参数为泛型委托(该泛型委托的返回值为布尔型)

           foreach(T item in source)

                if(predicate(item))//如果返回的是真,返回项

                    yield return item;

}|

}

}

 

//普通调用Enumerable.Where(names,s=>s.Length<6)

//但扩展方法运行我们这样调用,因为对了names进行扩展

name.Where(s=>Length<6);

 

在LINQ to sqL中

一般我们没有去理会它的返回类型都是用var隐式类型去处理(比较简洁,并且C#会进行类型验证的,不是弱类型):

var contents = from p in dbc.NewsContent where p.NewsId == 1 select p;//正常使用

IQueryable<WebApplication2.NewsContent> contents = from p in dbc.NewsContent where p.NewsId == 1 select p;//其实背后的类型它会自动转为需要的类型,是一个IQueryable<T>泛型,因为IQueryable接口是集成IEnumerable接口的,所以有了迭代功能,还有类型判断等。

posted @ 2015-03-12 20:47  yisic  阅读(113)  评论(0)    收藏  举报