【问题标题】:Using Dapper with multiple inner joins将 Dapper 与多个内部连接一起使用
【发布时间】:2019-09-04 08:11:27
【问题描述】:

我正在尝试将 Dapper 与以下 sql 字符串一起使用,但无法正常工作:

string groupsStringDetailed = "SELECT SUSERGROUP.NAME, SUSERGROUP.DESCRIPTION, SPROGRAMS.PROGRAMNAME, SOBJECTS.NAME FROM ((SIDE.SADMIT SADMIT " +
        "INNER JOIN SIDE.SOBJECTS SOBJECTS ON (SADMIT.PROGRAMID=SOBJECTS.PROGRAMID) AND (SADMIT.OBJECTID=SOBJECTS.ID)) " +
        "INNER JOIN SIDE.SUSERGROUP SUSERGROUP ON SADMIT.GROUPID=SUSERGROUP.GROUPID) " +
        "INNER JOIN SIDE.SPROGRAMS SPROGRAMS ON SOBJECTS.PROGRAMID=SPROGRAMS.ID " +
        "WHERE SUSERGROUP.NAME NOT LIKE '%REPORT' ORDER BY SUSERGROUP.NAME, SPROGRAMS.PROGRAMNAME";

我有以下模型类:

public class SAdmit
{
    public int GROUPID { get; set; }
    public int OBJECTID { get; set; }
    public int PROGRAMID { get; set; }

}

public class SObjects
{
    public int ID { get; set; }
    public int PROGRAMID { get; set; }
    public string NAME { get; set; }

}

public class SPrograms
{
    public int ID { get; set; }
    public string PROGRAMNAME { get; set; }
}

public class SUserGroup
{
    public int GROUPID { get; set; }
    public string NAME { get; set; }
    public string DESCRIPTION { get; set; }
    public int VWLISTDEPTH { get; set; }
    public int WDNBDAYHISTORY { get; set; }
    public string RPDIRECTORY { get; set; }
    public string SENDEREMAIL { get; set; }
    public int CONNECTION_TIMEOUT { get; set; }
    public int APPROVALSTATUS { get; set; }
}

我创建了一个自定义组类,希望能够更轻松地映射这些模型:

public class CustomSGroup
{
    public SUserGroup Group { get; set; }
    public SPrograms Programs { get; set; }
    public SObjects Objects { get; set; }

}

我正在尝试使用 Dapper 来获得我想要的结果:

                var output = await cnn.QueryAsync<CustomSGroup, SAdmit, SObjects, SPrograms, CustomSGroup>(groupsStringDetailed, (g, a, o, p) =>
                {
                    a.PROGRAMID = o.PROGRAMID;
                    a.OBJECTID = o.ID;
                    a.GROUPID = g.Group.GROUPID;
                    o.PROGRAMID = p.ID;
                    return g;
                }, splitOn: "PROGRAMID, OBJECTID, GROUPID, NAME");

但我无法看到全局以及我做错了什么,因为它会引发异常

"When using the multi-mapping APIs ensure you set the splitOn param if you have keys other than Id\r\nParameter name: splitOn"

我可以将 Dapper 与更简单的(一个)内部连接 ​​sql 字符串一起使用,但是我无法让它工作。

【问题讨论】:

    标签: c# sql inner-join dapper


    【解决方案1】:

    我查看了代码,得出的结论是,您根本没有包括需要拆分的字段。将以下字段添加到您的查询中(可能为共享相似字段名称的类型添加不同的标签。

    PROGRAMID, OBJECTID, GROUPID, NAME
    

    【讨论】:

    • 好吧,我不确定这是否是我必须做的正确拆分。我确定的是查询是正确的。也许我应该根据它调整拆分。
    • @Mihaimyh - 我会仔细查看查询。请注意,您有 2 个名为 Name 的重复列。我在查询中根本没有看到PROGRAMID, OBJECTID, GROUPID。我所知道的是,Dapper 需要它们才能将值映射到数据对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多