PetaPoco可以使用带有join子句的存储过程填充对象吗?

时间:2013-06-24 22:04:20

标签: stored-procedures orm petapoco

我有一个类似于以下内容的存储过程:

SELECT a.TaskId, b.CompanyCode FROM task a JOIN company b ON b.CompanyId = a.CompanyId;

我有一个名为TaskItem的对象,它具有TaskId和CompanyCode属性,但是当我执行以下操作时(我假设它已经工作):

        var masterDatabase = new Database("MasterConnectionString");
        var s = PetaPoco.Sql.Builder.Append("EXEC spGetTasks @@numberOfTasks = @0", numberOfTasks);
        var tasks = masterDatabase.Query<TaskItem>(s);

问题是任务表中不存在CompanyCode列,我做了跟踪,似乎PetaPoco正在尝试从任务表中选择所有属性并使用存储过程进行填充。

以下是TaskItem的定义:

public class TaskItem {
    public int TaskItemId { get; set; }
    public int CompanyId { get; set; }
    public string CompanyCode { get; set; }
    public int Status { get; set; }
}

如何使用PetaPoco简单地使用存储过程的结果填充任务对象列表?

2 个答案:

答案 0 :(得分:1)

如果您只需要数据库中的两列,请不要打扰POCO。使用动态:

var d = masterDatabase.Query<dynamic>("Exec spGetTasks @@numberOfTasks = @0", numberOfTasks);
var result = d.Select(item => new Tuple<int, string>(item.TaskId, item.CompanyCode)).ToList();

否则您用于查询数据库的POCO,即TaskItem需要为查询返回的每个列名具有公共属性。

<强>更新 现在您已经发布了TaskItem的定义,我发现您拥有所需的所有属性。理论上,拥有一个与返回列完全相同的公共属性就足以填充它。因此,在您的情况下,由于查询返回列CompanyCode,因此应在TaskItem上填充相应的属性。如果属性名称不同,您可以通过使用[Column]属性

进行装饰来映射它
[Column("NameOfTheColumn")]
public string CompanyCode { get; set; }

如果出于某种原因CompanyCode仍未填充,则问题出在查询上。确保它返回适当的结果。

答案 1 :(得分:1)

除了将dynamic用作@Dmitry点之外,您还可以将该属性添加到TaskItem POCO,并使用ResultColumn

进行装饰
    [ResultColumn]
    public string CompanyCode { get; set; }