c# - 将 dapper 与 JOIN 一起使用

标签 c# sql join asp.net-core dapper

我有一个包含多个连接的查询,例如:

var sqlFindByProviderNameAndProviderSubjectId = $@"
     SELECT u.*, la.*, p.*, cp.*, scr.*, lm.*, wm.*
     FROM [user].[User] u
     LEFT JOIN [user].[LinkedAccount] la ON u.Id = la.UserId
     LEFT JOIN [user].[PatientProfile] p ON u.Id = p.UserId
     LEFT JOIN [user].[CareProviderProfile] cp ON u.Id = cp.UserId                
     LEFT JOIN [user].[Screening] scr ON u.Id = scr.UserId
     LEFT JOIN [user].[LengthMeasurement] lm ON scr.Id = lm.ScreeningId
     LEFT JOIN [user].[WeightMeasurement] wm ON scr.Id = wm.ScreeningId                 
                WHERE u.Id = (
                    SELECT UserId
                    FROM [user].[LinkedAccount] la
                    WHERE la.ProviderName = @ProviderName AND la.ProviderSubjectId = @ProviderSubjectId)";

我使用 dapper 将表非物质化为强类型实体,例如:

await UnitOfWork.Connection.QueryAsync<User, LinkedAccount, PatientProfile, CareProviderProfile, Screening, LengthMeasurement, WeightMeasurement, User>(query,
    (u, la, p, cp, scr, lm, wm) =>
    {
        // mapping code here
    }

这很好用。

但是,我必须向查询添加一个额外的 JOIN,但不幸的是,QueryAsync<> 最多需要 7 个参数/类型,而我有更多。

还有其他方法可以将多个表从 JOIN 映射到实体吗?

最佳答案

Dapper 不关心你的连接,Dapper 关心的是表格结构。该框架默认使用 id 列,或自定义 SplitOn 将表格结构解析为对象。所以表格结构如下:

Tabular:
Id | A | Id | B | Id | C | Id | D | Id | E | Id | F | Id | G | Id | H

您告诉 Dapper 存在八个实体,Dapper 通过 id 列执行此操作。现在,如果你有一个实体,但它不需要以这种方式抽象,例如 A、B 和 C 应该在一个实体中,那么你可以通过生成以下内容告诉 Dapper 不要为它们创建单独的实体结构。

Tabular:
Id | A | B | C | Id | D | Id | E | Id | F | Id | G | Id | H

我要表达的意思是实体不应该代表表格,而是代表您意图的对象。例如,用户可能有地址信息,但在数据库中它们可能是单独的表,但在您的应用程序中它们可能是一个对象。

根据数据表,我假设您可以在不失去业务意图的情况下合并一对。哪个基于拆分将解决您的问题,否则我不确定您将如何超过 Dapper 内置的七个拆分功能。

关于c# - 将 dapper 与 JOIN 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55247166/

相关文章:

c# - ASP.NET Core CORS 请求被阻止;为什么我的 API 没有应用正确的 header ?

mysql - 如何在 mySQL 中选择没有 Null 的最后一列

mysql - 需要理解这个查询逻辑

c# - 如何在单独的文件中从 web.config 中提取一个部分

c# - 运行时嵌入 UserControl 'loses' 列的 ListView

mysql - SQL查询根据条件返回额外的列

从累积数据中获取单个值的 SQL 查询

MySQL IN 子句太慢,无法使 JOIN 正常工作

mysql - 使用零计数的左连接和内连接对结果进行分组

c# - LINQ 的 Join 操作产生零项