通过这种架构模式进行系统开发后,我们一目了解的就知道系统的每一个逻辑的过程,更像一种工作流的执行方式,先是什么然后是什么。不像在if else里面充斥着乱七八糟的逻辑,很难维护。不愧为企业应用架构模式的一种啊。当然linq中只有linq to object 才会出现重复的使用一到两个方法来完成功能,像Linq to entity几乎不会出现这种情况。一般针对查询的优化只是关键字存在于不同的查询上下文中,这里是它为了讲解它的背后设计原理。
这篇文章的重点就在这一节了,上面说了那么多的话如果朋友能懂还好不懂的话还真是头疼。这一节我将给出LINQ的核心的执行图,我们将很清楚的看见LINQ的最终表达式树的对象结构,它是如何构建一棵完整的树形结构的,IQueryable接口是怎么和IQueryProvider接口配合的,为什么IQueryable具备延迟加载的能力。文章的最后将给出一个完整的Linq to Provider的小例子,喜欢扩展LINQ的朋友肯定会喜欢的。
public class DbQuery<T>:IQueryable<T>,IDisposable
{
public DbQuery(){
Provider = new DbQueryProvider();
Expression = Expression.Constant(this);//最后一个表达式是将第一IQueryable对象的引用。}
public DbQuery(Expression expression){
Provider = new DbQueryProvider();
Expression = expression;}
public Type ElementType
{
get{
returntypeof(T);}
private set{
ElementType = value;}}
public System.Linq.Expression.Expresison Expression
{
get;private set;}
public IQueryProvider Provider
{
get;private set;}
public IEnumerator<T>GetEnumeartor(){
return(Provider.Execute<T>(Expression) as IEnumerable<T>).GetEnumerator();}
System.Collection.IEnumerator.GetEnumerator System.Collections.IEnumerable.GetEnumerator(){
return(Provider.Execute(Expression) as IEnumerable).GetEnumerator();}
public voidDispose(){
}}
下面我们需要实现提供程序
public class DbQueryProvider:IQueryProvider
{
public IQUeryable<TElement> CreateQuery<TElement>(System.Linq.Expressions.Expression expression){
return new DbQuery<TElement>();}
public IQueryable CreateQuery(System.Linq.Expression.Expression expression){
//这里牵扯到表达式树的分析,就不多说了
throw new NotImplementedException();}
public TResult Execute<TResult>(System.Linq.Expressions.Expression expression){
returndefault(TResult);//强类型数据集}
public object Execute(System.Linq.Expressions.Expression expression){
return new List<object>();//弱类型数据集}}
看看我们如何使用
using(DbQuery<Ordder> dbquery = new DbQuery<Order>()){
var orderList = from order in dbquery where order.OrderName=="111" select order;
orderList.Provider.Execute<List<Order>>(orderList.Expression);//立即执行foreach(var o in orderList){
//延迟执行。}}