2017-02-14 39 views
2

我一直在好奇Dapper(或者其他ORMs)如何與LINQ結合處理對象檢索。Dapper在Linq操作之前從數據庫請求完整對象嗎?

如果我有這樣一個類:

public static IEnumerable<SitePage> GetAll() 
{ 
    using (IDbConnection cn = new SqlConnection(g.Global.CONX)) 
    { 
     cn.Open(); 
     return cn.GetAll<SitePage>(); 
    } 
} 

和我建立這樣的查詢:

var result = SitePage.GetAll().Select(c=> new { c.id, c.PageUrl, c.ParentId }); 

我很好奇,如果在後臺,整個記錄集獲取包括拉所有其他列(可能包含非常大的變種),或者Dapper從這個查詢中理解的僅僅是拉入我從sql db請求的列中?我意識到這是一種新手,但我想更好地理解Dapper/LINQ交互。

在這裏發佈了一個類似的問題:selecting-specific-columns-using-linq-what-gets-transferred,但我不確定是否完全回答。海報有2個問題,也沒有使用我通常喜歡的lambda表達式。

對此的回答會讓我頭腦發熱(並且很可能會改變我的編碼方式,因爲我一直保持謹慎,並且覺得我通過顯式sql編寫了太多的代碼)。

+1

請參閱。 http://stackoverflow.com/a/35956207/5779732 –

+0

@A_J您提供的鏈接也非常有幫助,並且是一個很好的提醒,因爲我認爲我曾經見過它。 – secretwep

回答

5

Dapper不會將您的lambda表達式轉換爲SQL,因此在您的情況下,Dapper生成的SQL查詢會返回完整實例SitePage

如果看看Dapper的GetAll<T>方法的簽名,可以快速知道是否是這種情況。因爲它返回IEnumerable<T>,這意味着它返回一個T的集合,因此在此之後使用的任何運算符(例如Select)將應用於完整集合。簡而言之,在撥打GetAll<T>之後,你不再處於小巧世界。

如果您在過去完全成熟的ORM中使用 - 我的意思是具有更多的功能,不一定更好 - 比如實體框架或NHibernate,您會注意到一些API返回IQueryable<T>,這表示一個查詢沒有尚未執行。因此,您在IQueryable<T>上使用的運營商(例如SelectWhere)實際上會修改查詢。當您通過迭代查詢或對其調用ToListToArray來實現查詢時,ORM會將您的查詢表達式樹轉換爲SQL,並將該查詢發送到數據庫。

+0

「**如果您以前使用的是完全成熟的ORM,那麼我的意思是具有更多的功能,不一定更好**」完全同意。 Upvoted。 –

+0

這個說明對我來說真的很有用,我很欣賞你描述的有關EF的對比,我對它的使用也有限制。 – secretwep

相關問題