2

一段时间以来,我一直对 Dapper(或其他 ORM)在与 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 });

我很好奇,如果在后台,整个记录集被拉入包括所有其他列(可能包含非常大的 varchars),或者 Dapper 是否从这个查询中理解只是拉入我从 sql db 请求的列?我意识到这有点新奇,但我想更好地理解 Dapper/LINQ 交互。

此处发布了一个类似的问题:selection-specific-columns-using-linq-what-gets-transferred,但我不确定是否已完全回答。海报有 2 个问题,也没有使用我通常喜欢的 lambda 表达式。

这个问题的答案会让我大吃一惊(并且很可能会改变我的编码方式,因为我一直很谨慎,并且觉得我通过显式 sql 编写了太多代码)。

4

1 回答 1

5

Dapper 不会将您的 lambda 表达式转换为 SQL,因此在您的情况下,Dapper 生成的 SQL 查询返回SitePage.

如果查看 DapperGetAll<T>方法的签名,则可以快速了解是否是这种情况。当它返回时IEnumerable<T>,这意味着它返回 的集合T,因此您在此之后使用的任何运算符(例如Select在您的情况下)都将应用于整个集合。简而言之,调用GetAll<T>.

如果您过去使用过成熟的 ORM(我的意思是具有更多功能,不一定更好),例如 Entity Framework 或 NHibernate,您会注意到一些 API 返回IQueryable<T>,它表示尚未执行的查询。IQueryable<T>因此,您在、Select和上使用的运算符Where实际上会修改查询。当您通过迭代或调用ToListorToArray来实现查询时,ORM 会将您的查询表达式树转换为 SQL 并将该查询发送到数据库。

于 2017-02-14T22:08:46.263 回答