|
系列文章導(dǎo)航:
Linq To Sql進(jìn)階系列(二)M:M關(guān)系
Linq To Sql進(jìn)階系列(三)CUD和Log
Linq To Sql進(jìn)階系列(四)User Define Function篇
Linq To Sql進(jìn)階系列(五)Store Procedure篇
Linq To Sql進(jìn)階系列(六)用object的動(dòng)態(tài)查詢與保存log篇
Linq To Sql進(jìn)階系列(七)動(dòng)態(tài)查詢續(xù)及CLR與SQL在某些細(xì)節(jié)上的差別
在上面一篇文章Linq To Sql進(jìn)階系列(六)中,我們提到了使用object的動(dòng)態(tài)查詢。本文在上文的基礎(chǔ)上,再做更加深入的引申。同時(shí)修正上文中一些不妥的地方。
1, object的動(dòng)態(tài)查詢續(xù)
首先要做的事情,就是將Find的函數(shù)改成擴(kuò)展方法。擴(kuò)展方法只能放在靜態(tài)類里,而且它的第一個(gè)參數(shù)必須帶this關(guān)鍵字。在上文中,作者留下了一個(gè)迷題。當(dāng)需要or條件時(shí),又該如何做呢?本文也將這個(gè)問題給出回答。但是對于動(dòng)態(tài)Like的條件,筆者依然還沒有找到一個(gè)較好的方法。為了增加or條件,函數(shù)的聲明也再一次被改動(dòng)。如下:
public static IQueryable<TEntity> Find<TEntity>(this IQueryable<TEntity> source, TEntity obj, bool isAnd) where TEntity : class
在上文中,我們還碰到了System.Nullable<int>此類類型不支持的問題。其實(shí)這個(gè)地方主要原因在于我們構(gòu)造right端的Expression Tree時(shí),沒有給它參數(shù)。那么這個(gè)問題通過Expression right = Expression.Constant(p.GetValue(obj, null), p.PropertyType); 可以得到修復(fù)。那整個(gè)函數(shù)修改后,如下:

bool isAnd) where TEntity : class





BindingFlags.Instance);





























("VarBinary(MAX)"))


































系列文章導(dǎo)航:
Linq To Sql進(jìn)階系列(二)M:M關(guān)系
Linq To Sql進(jìn)階系列(三)CUD和Log
Linq To Sql進(jìn)階系列(四)User Define Function篇
Linq To Sql進(jìn)階系列(五)Store Procedure篇
Linq To Sql進(jìn)階系列(六)用object的動(dòng)態(tài)查詢與保存log篇
Linq To Sql進(jìn)階系列(七)動(dòng)態(tài)查詢續(xù)及CLR與SQL在某些細(xì)節(jié)上的差別
在這里,首先檢查輸入的參數(shù)是否為null。擴(kuò)展方法其實(shí)是按靜態(tài)方法執(zhí)行的。它和靜態(tài)方法唯一不同的就是系統(tǒng)自動(dòng)為其加了一個(gè)Attribute,而這個(gè)Attribute只能通過在第一個(gè)參數(shù)加this關(guān)鍵字才能獲得。而后,在影射類型上,修改后的函數(shù)只支持?jǐn)?shù)值型和string型。其原因就是像imager等并不支持條件查詢。為了簡化,我們只支持?jǐn)?shù)值型和string型。這里最大的變化莫過于支持or條件了。調(diào)用Expression.And或Expression.Or就可以了。還有一個(gè)變化就是ParameterExpression對象和Expression<Func<TEntity, bool>>被移出了foreach循環(huán)。這樣,提高了效率,只是在最后才去生成條件。
而實(shí)際上,大家大多使用是and條件,那再重載一個(gè)方法。




系列文章導(dǎo)航:
Linq To Sql進(jìn)階系列(二)M:M關(guān)系
Linq To Sql進(jìn)階系列(三)CUD和Log
Linq To Sql進(jìn)階系列(四)User Define Function篇
Linq To Sql進(jìn)階系列(五)Store Procedure篇
Linq To Sql進(jìn)階系列(六)用object的動(dòng)態(tài)查詢與保存log篇
Linq To Sql進(jìn)階系列(七)動(dòng)態(tài)查詢續(xù)及CLR與SQL在某些細(xì)節(jié)上的差別
2,限定字段在某集合中
這有點(diǎn)像in操作。比如where city in ('London', 'BeiJing') 也可以寫成 where city = 'London' or city = 'BeiJing'。既然談到or條件的動(dòng)態(tài)構(gòu)造了,那就也來構(gòu)造下這個(gè)吧。看上去有點(diǎn)多此一舉。但是,至少是個(gè)很好的學(xué)習(xí)機(jī)會(huì)。這個(gè)和上面不同的是,它條件字段是唯一的,變化的是該字段的值。那用一string將字段名成傳入,并用一集合將字段值傳入函數(shù)。
該函數(shù)完整的定義入下:


string propertyName, IEnumerable<OrType> values)
















param));



系列文章導(dǎo)航:
Linq To Sql進(jìn)階系列(二)M:M關(guān)系
Linq To Sql進(jìn)階系列(三)CUD和Log
Linq To Sql進(jìn)階系列(四)User Define Function篇
Linq To Sql進(jìn)階系列(五)Store Procedure篇
Linq To Sql進(jìn)階系列(六)用object的動(dòng)態(tài)查詢與保存log篇
Linq To Sql進(jìn)階系列(七)動(dòng)態(tài)查詢續(xù)及CLR與SQL在某些細(xì)節(jié)上的差別
3, CLR與SQL在某些細(xì)節(jié)上的差別
在上文中,有一朋友提出,其值不為null才做為條件,讓函數(shù)有局限性。既然提了,那筆者就再引申下。CLR與SQL中,對待null值是不同的。CLR認(rèn)為兩個(gè)null值是相等的,而SQL并不這么認(rèn)為。比如,下面的條件就是成立的。
if (null == null)
throw new Exception("CLR treat Null is the same!!");
但在Sql中只能判斷是不是null值,而不能對兩個(gè)字段的null值直接比較。
比如下面的語句
var q6 = db.Employees.Where(c => c.Region == null).ToList();
翻譯為:






it知識(shí)庫:Linq To Sql進(jìn)階系列(七)動(dòng)態(tài)查詢續(xù)及CLR與SQL在某些細(xì)節(jié)上的差別,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。