RT
初入 Linq to sql 的坑,這里面的東西還不太理解,想來問下。
舉個例子:
private void Button_Click(object sender, RoutedEventArgs e)
{
DataClasses1DataContext dc = new DataClasses1DataContext();
Console.WriteLine("dc.DeferredLoadingEnabled : {0}", dc.DeferredLoadingEnabled);// 這里列印出來是 true
var qa = from p in dc.table1 select p;
qa = qa.Where(p => (p.t1 < 5));
List<table1> list = qa.ToList();
Console.WriteLine("list.Count : {0}", list.Count);
}
資料庫 里面是下面這個樣子:

就這個例子,我和同事 發生了 不同的意見:
意見一:我說 應該是 延遲加載,到使用 “qa.ToList();” 的時候才做sql查詢,只有 一條SQL陳述句,select出來 3條記錄。
意見二:但是不同意見是 ,在 除錯模式中,執行完“var qa = from p in dc.table1 select p;”看qa的結果視圖,是 5條記錄,如下圖,于是就說 linq是將 所有記錄全部取回到記憶體,然后再做 where的條件篩選。

想問問 上面 兩種意見,哪個正確?最好能 講一下原理理由
請大家幫忙指點下
任何 意見、代碼、鏈接、資料 都可以,歡迎提供 相關材料,先 謝過大家了 !!
uj5u.com熱心網友回復:
除錯模式下查看相當于是輸出結果。你用sql server profiler 工具監視一下什么時刻執行sql陳述句就有結果了。逐行除錯查看是否有sql陳述句生成就可以了。uj5u.com熱心網友回復:
那就沒見過,vs在你展開的時候提示“接收超時”么東西是給你看的,你想看人家就給你看,難道你點展開,微軟不讓你看,提示你“對不起少年,請先tolist么”
uj5u.com熱心網友回復:
那玩意的正式名稱叫“可視化除錯器”----目的就是讓你看的,比如你可以自己擴展一個Image的可視化除錯器,也可以自己擴展一個json的可視化除錯器(展示一下比如jsonTree,你寫的json的時候有tree么,沒有。但人家展示給你的,可以帶tree展示,也就是你看到只是人家想展示的,不是他實際上運行的)uj5u.com熱心網友回復:
無論意見1還是意見2,你只要去看 ,當他們是IQueryable<T>時,那就是還沒執行。
當他們是IEnumerable<T>時,那就是執行了。
uj5u.com熱心網友回復:
感謝大家
uj5u.com熱心網友回復:
來https://blog.csdn.net/ma_jiang/article/details/53065809
這是俺們程式員自己擴展的非vs自帶可視化編輯器,你看他貼的代碼,其中的 xxxx as xxxx,也就是是告訴你,這個編輯內部可以有代碼的,這個代碼可以去執行的,所以他要展示一個linq,可以去展示結果,當然也可以去展示生成的運算式樹(ps:這種展示linq生成的運算式樹的第3方可視化編輯器其實很早就有,只是不太常用,我已經忘了叫啥了)
uj5u.com熱心網友回復:
多謝兄臺詳細的回復
uj5u.com熱心網友回復:
最簡單的就是啟用資料庫跟蹤了,除錯代碼,看看具體資料庫執行的啥sql就知道了。uj5u.com熱心網友回復:
sql server的話,就是 SQL Server Profiler了吧?
uj5u.com熱心網友回復:
是的
uj5u.com熱心網友回復:
IQueryable就是延遲執行……uj5u.com熱心網友回復:
斷點 加 sqlprofiler監視uj5u.com熱心網友回復:
添加監視器看下 執行計劃,2個時間 比較下。轉載請註明出處,本文鏈接:https://www.uj5u.com/net/117660.html
標籤:LINQ
