EF架構~在ef中支持IQueryable級別的Contains被翻譯成了Exists,性能可以接受!


回到目錄

Entityframeworks很聰明

不錯,非常不錯!ef里的contains比linq to sql里的contains有了明顯的提升,事實上,是在進行SQL語句翻譯上有所提升,在linq to sql里不支持iqueryable的contains集合,它只支持本地集合進行contains,而本地集合的contains會被.net翻譯成sql語句是where in (...),即集合有多個元素,在in里就會被列舉多少次,這個在性能上是非常低下的,不提倡的,而且它還有長度限制,最多本地集合在linq to sql里是2000多個元素。

ef在這點上表示不錯,它為了防止你使用低下的查詢,它杜絕你在linq語句中去ToList()對象,這是不錯的選擇,對於EF中的contains的用法,我們一般是分兩步,第一查詢出要列舉的結果集,但不要ToList(),第二是使用contains語句,當EF把它發到SQL端時,這個語句被翻譯成了exist,我們知道,這種查詢的性能一定是比where in強的,不說SQL本身就說網絡傳輸,它也一定比前者省了不少,呵呵。

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();
SQL語句截圖

正確的
 var linq = (from data1 in GetUser().Where(i => i.UserID <= 50) select data1.UserID);//IQueryable<int>,一個查詢計划

 var linq2 = GetUser_StudyRecord().Where(i => linq.Contains(i.UserID.Value)).ToList();
SQL語句截圖

怎么樣,看了截圖,不說,你也知道哪個性能好了吧,呵呵!

回到目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM