EF架(jia)構~在ef中支持IQueryable級別的Contains被翻譯(yi)成了Exists,性能可以接受!
Entityframeworks很聰明
不(bu)錯,非常不(bu)錯!ef里(li)的contains比(bi)linq to sql里(li)的contains有(you)了明(ming)顯(xian)的提升,事(shi)實上(shang),是在(zai)(zai)進(jin)行SQL語句(ju)翻(fan)(fan)譯上(shang)有(you)所提升,在(zai)(zai)linq to sql里(li)不(bu)支持(chi)iqueryable的contains集合(he)(he),它只支持(chi)本地(di)集合(he)(he)進(jin)行contains,而本地(di)集合(he)(he)的contains會(hui)被(bei).net翻(fan)(fan)譯成sql語句(ju)是where in (...),即集合(he)(he)有(you)多(duo)個(ge)元素,在(zai)(zai)in里(li)就會(hui)被(bei)列舉多(duo)少次(ci),這個(ge)在(zai)(zai)性能上(shang)是非常低下的,不(bu)提倡的,而且(qie)它還(huan)有(you)長(chang)度限制(zhi),最多(duo)本地(di)集合(he)(he)在(zai)(zai)linq to sql里(li)是2000多(duo)個(ge)元素。
ef在這點上表示不(bu)錯,它為了(le)(le)防(fang)止你使用(yong)低下的(de)查(cha)(cha)詢(xun),它杜絕你在linq語句中去ToList()對象,這是(shi)不(bu)錯的(de)選(xuan)擇,對于EF中的(de)contains的(de)用(yong)法,我們一(yi)般是(shi)分兩步,第一(yi)查(cha)(cha)詢(xun)出要列舉的(de)結果集,但不(bu)要ToList(),第二(er)是(shi)使用(yong)contains語句,當EF把它發到SQL端時,這個語句被(bei)翻譯成了(le)(le)exist,我們知道,這種查(cha)(cha)詢(xun)的(de)性能(neng)一(yi)定(ding)(ding)是(shi)比where in強的(de),不(bu)說SQL本(ben)身就說網絡(luo)傳輸,它也(ye)一(yi)定(ding)(ding)比前者省了(le)(le)不(bu)少,呵呵。
Entityframeworks中正確使用Contains語句的Demo
var linq = (from data1 in GetUser().Where(i => i.UserID <= 50) select data1.UserID).ToList(); var linq2 = GetUser_StudyRecord().Where(i => linq.Contains(i.UserID.Value)).ToList();
var linq = (from data1 in GetUser().Where(i => i.UserID <= 50) select data1.UserID);//IQueryable<int>,一個查詢計劃(hua) var linq2 = GetUser_StudyRecord().Where(i => linq.Contains(i.UserID.Value)).ToList();
怎么樣,看了截圖,不說,你也(ye)知道哪個性能好了吧,呵(he)呵(he)!