我有一个使用 Petapoco 填充的对象列表。
类属性和名称与数据库模式相匹配。主类是Issue,它与另外两个名称和属性也与数据库模式匹配的类相关:Condition和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附加到我检索到的每个问题。
为此,我可以:
- 在 foreach 循环中,在读取之后附加源和目标条件,
- 或检索整个条件列表,然后使用相同的 for-each 附加到每个问题。
目前,我正在使用第二种解决方案,因为数据库中的 Condition 集是有限的。
无论如何,这样做对我来说听起来有点沉重,因为它需要完成的查询几乎与添加的 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 用于我的更新/插入操作?