生成SQL語(yǔ)句的功能可以算是LinqToDB框架的最后一步。從上一章中我們可以知道處理完表達(dá)式樹(shù)之后,相關(guān)生成SQL信息會(huì)被保存在一個(gè)叫SelectQuery類的實(shí)例。有了這個(gè)實(shí)例我們就可以生成對(duì)應(yīng)的SQL語(yǔ)句。想要了解這一步部分的功能就必須從三個(gè)方面入手。一、Linq To SQL的機(jī)制原理。二、如何生成SQL語(yǔ)句。三、設(shè)置映射結(jié)果。
生成映射表達(dá)式
對(duì)于Linq To SQL的機(jī)制原理在前面的章節(jié)里面已經(jīng)講過(guò)了。這里筆者提出來(lái)主要目標(biāo)是明確什么時(shí)候觸發(fā)。下面的代碼不是看前面的獲得Query<T>類實(shí)列,而是看后面的GetIEnumerable方法調(diào)用。
ExpressionQuery<T>類:
IEnumerable<T> Execute(IDataContextInfo dataContextInfo, Expression expression) { return GetQuery(expression, true).GetIEnumerable(null, dataContextInfo, expression, Parameters);}
記得筆者前面幾個(gè)章節(jié)中講到最后都會(huì)去調(diào)用倆個(gè)方法分別是Query<T>類中的GetIEnumerable方法和GetElement方法。而這倆個(gè)方法都是Func類型。如下
public Func<QueryContext, IDataContextInfo, Expression, object[], object> GetElement;public Func<QueryContext, IDataContextInfo, Expression, object[], IEnumerable<T>> GetIEnumerable;
顯然很明顯在調(diào)用GetIEnumerable方法一定要知道哪一個(gè)方法賦給他了。好了,先暫停一下。讓我們?nèi)タ匆幌律弦徽轮泄P者講到Build<T>()方法有三個(gè)重要方法中的一個(gè)——BuildQuery()方法。
1 internal Query<T> Build<T>() 2 { 3 var sequence = BuildSequence(new BuildInfo((IBuildContext)null, Expression, new SelectQuery())); 4 5 &nbs