文章出處

回到目錄

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語句截圖

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

回到目錄


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()


    留言列表 留言列表

    發表留言