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接口的,所以有了迭代功能,还有类型判断等。
浙公网安备 33010602011771号