我有一个类似于以下内容的存储过程:
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简单地使用存储过程的结果填充任务对象列表?
答案 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; }