0

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

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 用存储过程的结果简单地填充任务对象列表?

4

2 回答 2

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需要为查询返回的每个列名称提供一个公共属性。

更新 现在您已经发布了TaskItemI 的定义,您可以看到您拥有所需的所有属性。从理论上讲,拥有一个与返回的列名称完全相同的公共属性就足以填充它。因此,在您的情况下,由于查询返回 column CompanyCode,因此应在TaskItem. [Column]如果属性名称不同,您可以通过使用属性对其进行装饰来映射它

[Column("NameOfTheColumn")]
public string CompanyCode { get; set; }

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

于 2013-06-24T23:18:37.957 回答
1

除了dynamic用作@Dmitry 积分之外,您还可以将属性添加到TaskItemPOCO,并使用ResultColumn

    [ResultColumn]
    public string CompanyCode { get; set; }
于 2013-06-25T14:06:54.500 回答