gpt4 book ai didi

c# - 将 dapper 与 JOIN 一起使用

转载 作者:太空狗 更新时间:2023-10-30 01:28:56 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com