2017-02-14 67 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

相关问题