Join Petapoco的多重映射可以处理多重连接吗?

Join Petapoco的多重映射可以处理多重连接吗?,join,mapping,dapper,petapoco,Join,Mapping,Dapper,Petapoco,我有一个使用Petapoco填充的对象列表 类属性和名称正在加工数据库架构。主类是Issue,它与另外两个名称和属性也与数据库模式匹配的类相关:Condition和SeverityLevel 实际上,当我检索问题列表时,我正在使用multimapping功能使用单个命令检索问题列表和相关的SeverityLevel: var Results = Db.Fetch<Issue, SeverityLevel, Issue>( (i, sl) => { i.

我有一个使用Petapoco填充的对象列表

类属性和名称正在加工数据库架构。主类是Issue,它与另外两个名称和属性也与数据库模式匹配的类相关:Condition和SeverityLevel

实际上,当我检索问题列表时,我正在使用multimapping功能使用单个命令检索问题列表和相关的SeverityLevel:

var Results = Db.Fetch<Issue, SeverityLevel, Issue>(
    (i, sl) => { 
        i.CurrentSeverityLevel = sl;
        return i;
    },
    "SELECT /* ..shortened.. */ FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "WHERE Issue.Id=@0", issueId);
现在,因为Petapoco似乎无法处理多个联接,所以我需要执行第二步,将SourceCondition和TargetCondition附加到我检索到的每个问题

为此,我可以:

读取后,在foreach循环中附加源条件和目标条件, 或者检索整个条件列表,然后使用相同类型的for each将其附加到每个问题。 目前,我使用第二种解决方案,因为数据库中的条件集有限

无论如何,这样做对我来说听起来有点沉重,因为它需要的查询数量几乎与添加联接表的查询数量相同

我想知道我是否能实现这样的目标:

var Results = Db.Fetch</* ????? */>(
    /* ???? */
    "SELECT /* ..shortened.. */ FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "LEFT JOIN Condition Con1 ON Con1.Id = Issue.SourceConditionId " + 
    "LEFT JOIN Condition Con2 ON Con2.Id = Issue.TargetConditionId " + 
    "WHERE Issue.Id=@0", issueId);
亲爱的Petapoco用户,亲爱的Petapoco作者,这是一种处理方法吗


如果可以的话,我可以用Dapper来处理这个问题吗?显然,我绝对想保留Petapoco用于我的更新/插入操作?

这应该可以做到

var Results = Db.Fetch<Issue, SeverityLevel, Condition, Condition, Issue>(
    (i, sl, c1, c2) => { 
        i.CurrentSeverityLevel = sl;
        i.SourceCondition = c1;
        i.TargetCondition = c2;
        return i;
    },
    "SELECT Issue.*, SeverityLevel.*, Con1.*, Con2.* FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "LEFT JOIN Condition Con1 ON Con1.Id = Issue.SourceConditionId " + 
    "LEFT JOIN Condition Con2 ON Con2.Id = Issue.TargetConditionId " + 
    "WHERE Issue.Id=@0", issueId);
我还没有测试过这个。 我也在研究一种自动化的方法


选择的列与参数类型的顺序相同,这一点非常重要

它起作用了!谢谢。我想我们已经达到了极限,因为我不能添加更多的连接。有可能,您只需要使用非泛型重载,或者如果您使用的是dotnet 4.0,您可以添加自己的重载,这些重载包含更多参数。4是.net 3.5的限制。
var Results = Db.Fetch<Issue, SeverityLevel, Condition, Condition, Issue>(
    (i, sl, c1, c2) => { 
        i.CurrentSeverityLevel = sl;
        i.SourceCondition = c1;
        i.TargetCondition = c2;
        return i;
    },
    "SELECT Issue.*, SeverityLevel.*, Con1.*, Con2.* FROM Issue " + 
    "LEFT JOIN SeverityLevel ON SeverityLevel.Id = Issue.SeverityLevelId " + 
    "LEFT JOIN Condition Con1 ON Con1.Id = Issue.SourceConditionId " + 
    "LEFT JOIN Condition Con2 ON Con2.Id = Issue.TargetConditionId " + 
    "WHERE Issue.Id=@0", issueId);