如何使用 Dapper 映射 OVER(PARTITION BY) 数据

问题描述 投票:0回答:0

我正在使用以下 SQL 查询来获取配置列表以及每个配置,最新实例按日期 DESC 排序。

SELECT Configurations.*, inst.* FROM (SELECT Instances.*, ROW_NUMBER()
OVER(PARTITION BY Configurations.ID ORDER BY Instances.CreateDate DESC)
AS [Row Number] FROM Configurations INNER JOIN Instances on
Instances.ConfigurationID = Configurations.ID) inst INNER JOIN
Configurations ON Configurations.Id=inst.ConfigurationId
WHERE inst.[Row Number] = 1

我的配置模型如下所示:

[ExplicitKey] public int Id { get; set; }        
public string Name { get; set; } = "";
//other params
[Write(false)] public virtual Instance CurrentInstance { get; set; } = new Instance();
[Write(false)] public virtual ICollection<Instance> Instances { get; set; } = new HashSet<Instance>();

我的实例对象有一个 FK 链接到配置。

我在 C# 中的 Dapper 请求如下所示:

var sql = "SELECT Configurations.*, inst.* FROM (SELECT Instances.*, ROW_NUMBER() OVER(PARTITION BY Configurations.ID ORDER BY Instances.CreateDate DESC) AS [Row Number] " +
"FROM Configurations INNER JOIN Instances on Instances.ConfigurationID = Configurations.ID) inst " +
"INNER JOIN Configurations ON Configurations.Id=inst.ConfigurationId " +
"WHERE inst.[Row Number] = 1";

return (await connection.QueryAsync<Models.Configuration, Instance, Models.Configuration>(sql,
                (config, instance) =>
                {
                    config.CurrentInstance = instance;
                    //config.Instances.Add(instance);
                    return config;
                }, splitOn: "ID").ConfigureAwait(false)).ToList();

我已经确认 SQL 语句返回了正确的结果,但是当 Dapper 尝试将其绑定到模型时,它会抛出破坏 VS 调试器的访问冲突。

VS 中的输出窗口是这样说的: 程序“[37088] iisexpress.exe”已退出,代码为 3221225477 (0xc0000005)“访问冲突”

当我运行相同的查询但在映射器中执行 Instances.Add(instance) 时,它以相同的方式中断。只有当我从 Configuration 模型中删除 CurrentInstance 时它才起作用,在 Instances 列表中带回我需要的单个记录。

是否有不同/更好的方法来设置这些模型或映射器来填充配置的 CurrentInstance 部分?

c# orm dapper dapper-contrib
© www.soinside.com 2019 - 2024. All rights reserved.