IQueryable<Custorm> temp = (from c in dbContext.Custorm
where c.CusName.Contains("zh") && c.Id == 2
select c);
介面一般不都是用物件賦值的嗎,對IQueryable<T>賦值的右邊的整體是個物件了?
了解了下IQueryable<T>,假如右邊是個實作了IQueryable<Custorm>介面的物件,它是怎么把右邊的運算式保存到了內部變數Expression上,這是怎么做到的,有原始碼嗎
右邊是個什么型別?運算式還是物件,是物件的話是什么型別物件?
uj5u.com熱心網友回復:
你先別管他是怎么保存到內部變數Expression上,怎么做到,有沒有原始碼的問題。右邊只是根據條件查詢出了sql,然后賦值給了IQueryable<Custorm>
在你沒有(from c........).toList()之前,他只是生成了一個sql陳述句,
并沒有實際查詢資料。
這樣做的好處,是懶加載。
uj5u.com熱心網友回復:
版主說的我明白,也看了很多IQueryable的介紹,但是后來的的疑問也就是題目所問,想知道具體的程序,不是只是這樣做有啥好處uj5u.com熱心網友回復:
編譯器會分析 你的 (from c .......)然后把對應的元素,存放到 Expression樹上。
通過這個Expression,能轉換為sql陳述句。
這個是原始碼:
https://referencesource.microsoft.com/#System.Core/System/Linq/IQueryable.cs,393160475d9b88ef
uj5u.com熱心網友回復:
謝謝
uj5u.com熱心網友回復:
右邊是個什么型別?運算式還是物件,是物件的話是什么型別物件?==
右邊是運算式,也是物件,它是Expression型別的物件。
你要記得c#是面向物件語言,一切皆物件。所以,比如委托也是類,是不是一樣難以理解?在面向物件的語言里,你就是應該用物件來解決問題。
uj5u.com熱心網友回復:
大哥說的和我今天看到的一篇介紹iqueryable的文章講的很像,他說的更詳細些"lambda運算式的本質是一個匿名方法,Func<TSource, bool>型別則是一個泛型委托,委托就是物件化的方法,有了委托我們就可以像操作一個物件一樣操作一個方法,比如作為引數進行傳遞。那么更進一步的,Expression則是方法運算式的物件化,它代表了上例中lambada運算式對應的代碼。Expression通過Expression Tree資料結構來存盤和描述代碼,這樣就給予我們檢查分析代碼的能力,像LINQ to SQL就可以分析運算式并生成對應的Sql陳述句,所以Expression是LINQ能夠實作的基礎。"
https://zhuanlan.zhihu.com/p/47776558
但 "右邊是運算式,也是物件,它是Expression型別的物件。" ,Expression能賦值給iquerayable介面嗎
uj5u.com熱心網友回復:
右側是運算式,同時它是linq運算式。同時你需要知道,linq運算式會被編譯為lamda運算式,就是:
IQueryable<tableA> query = context.tableA.Where(Expression);
注意,不是把Expression賦值給IQueryable,而是Expression作為引數,經過Where運算,得到IQueryable
uj5u.com熱心網友回復:
嗯,方法運算式是能回傳iqueryable的,大哥意思是linq運算式被編譯器先轉換成方法運算式,用方法來回傳Iqueryable了?uj5u.com熱心網友回復:
是
uj5u.com熱心網友回復:
在你沒有(from c........).toList()之前,他只是生成了一個sql陳述句,并沒有實際查詢資料。
uj5u.com熱心網友回復:
在你沒有(from c........).toList()之前,他只是生成了一個sql陳述句,
并沒有實際查詢資料。
uj5u.com熱心網友回復:
里面是委托你上面的可以改寫成
dbContext.Custorm.Where(c=>c.CusName.Contains("zh") && c.Id == 2)
F12進去看下就知道了
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/64896.html
標籤:C#
上一篇:aspx_npio,問題是:未能加載檔案或程式集“npio”或它的某一個依賴項。生成此程式集的運行時比當前加載的運行時新,無法加載此程式集
