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

类属性和名称正在缓存数据库模式。主要类是问题,它与名称和属性也与数据库架构也匹配的另外两个类相关:条件 SeverityLevel

public class Issue
{
    public int Id { get; set; } // Primary key

    /* Some properties... */
    public DateTime? CreatedOn { get; set; }
    public string CreatedBy { get; set; }
    public DateTime? ModifiedOn { get; set; }
    public string ModifiedBy { get; set; }

    /* ... */

    // Related source and target conditions
    [PetaPoco.Ignore]
    public Condition SourceCondition { get; set; }

    [PetaPoco.Ignore]
    public Condition TargetCondition { get; set; }

    // Related severity level
    [PetaPoco.Ignore]
    public SeverityLevel CurrentSeverityLevel { get; set; }
}

public class Condition
{
    public int Id { get; set; } // Primary Key
    public string Description  { get; set; }
}

public class SeverityLevel
{
    public int Id { get; set; } // Primary key
    public string Description { get; set; }
    public string HexColorDisplay { get; set; }
}

实际上,当我检索问题列表时,我正在使用多重映射功能通过一个命令来检索问题列表和相关的 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似乎无法处理多个JOINS,因此我需要执行第二步,将 SourceCondition TargetCondition 附加到我检索到的每个Issue上。

为此,我可以:
  • 在foreach循环
  • 中读取后附加Source和Target条件
  • 或检索条件的整个列表,然后使用相同的for-each将其附加到每个Issue。

  • 现在,我正在使用第二种解决方案,因为数据库中的条件集有限。

    无论如何,这样做对我来说有点沉重,因为与添加JOINED表一样,它几乎需要执行几乎所有的查询。

    我想知道我是否可以实现像这样的工作:
    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);
    

    我还没有测试。
    我也在研究一种自动化的方法。

    真的很重要,因为所选列的顺序必须与参数类型的顺序相同。

    关于join - Petapoco的多重映射可以处理多个JOIN吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6664239/

    10-11 06:34