sec*_*wep 2 linq sql-server dapper dapper-contrib
我一直很好奇Dapper(或许其他ORM)在与LINQ结合时如何处理对象检索.
如果我有这样的课程:
public static IEnumerable<SitePage> GetAll()
{
using (IDbConnection cn = new SqlConnection(g.Global.CONX))
{
cn.Open();
return cn.GetAll<SitePage>();
}
}
Run Code Online (Sandbox Code Playgroud)
我构建一个这样的查询:
var result = SitePage.GetAll().Select(c=> new { c.id, c.PageUrl, c.ParentId });
Run Code Online (Sandbox Code Playgroud)
我很好奇,如果在后台,整个记录集被拉入包括所有其他列(可能包含非常大的varchars),或者Dapper是否从这个查询中理解只是为了从sql db中提取我请求的列?我意识到它有点像新手,但我想更好地理解Dapper/LINQ交互.
这里发布了一个类似的问题:选择特定列 - 使用linq-what-gets-transferred,但我不确定是否已经完全回答.海报有2个问题,也没有使用我通常喜欢的lambda表达式.
对此的回答将使我的思绪发火(并且很可能改变我编码的方式,因为我一直谨慎并且觉得我通过显式sql编写了太多代码).
Dapper不会将lambda表达式转换为SQL,因此在您的情况下,Dapper生成的SQL查询将返回完整的实例SitePage.
如果查看Dapper GetAll<T>方法的签名,可以快速了解是否属于这种情况.当它返回时IEnumerable<T>,它意味着它返回一个集合T,因此您之后使用的任何运算符(如Select您的情况)将应用于完整集合.简而言之,你打电话后就不再在Dapper世界了GetAll<T>.
如果您在过去使用成熟的ORM - 我的意思是更多功能,不一定更好 - 比如Entity Framework或NHibernate,您会注意到某些API返回IQueryable<T>,这表示尚未执行的查询.因此,您使用的运算符IQueryable<T>,如Select和Where,实际上修改了查询.通过迭代或调用ToList或ToArray在其上实现查询,然后ORM将查询表达式树转换为SQL并将该查询发送到数据库.
| 归档时间: |
|
| 查看次数: |
551 次 |
| 最近记录: |