1

我的应用程序是如下的实体模型并使用 Dapper

public class Goal
{
    public string Text { get; set; }
    public List<SubGoal> SubGoals { get; set; }
}

public class SubGoal
{
    public string Text { get; set; }
    public List<Practise> Practices { get; set; }
    public List<Measure> Measures { get; set; }
}

并有一个如下的存储库

public interface IGoalPlannerRepository
{
    IEnumerable<Goal> FindAll();
    Goal Get(int id);
    void Save(Goal goal);
}

我遇到了以下两种情况

  1. 在检索数据(目标实体)时,它需要检索层次结构中的所有相关对象(所有子目标以及实践和措施)
  2. 保存目标后,需要插入和/或更新所有相关数据

请建议是否有更好的方法来处理这些场景,而不是“循环”集合和编写大量的 SQL 查询。

4

1 回答 1

4

使用 Dapper 在 SQL 中进行大批量数据更新的最佳方法是使用复合查询。

您可以在一个查询中检索所有对象作为多个结果集,如下所示:

CREATE PROCEDURE get_GoalAndAllChildObjects
    @goal_id int
AS
SELECT * FROM goal WHERE goal_id = @goal_id
SELECT * FROM subgoals WHERE goal_id = @goal_id

然后,您编写一个小巧的函数来检索对象,如下所示:

using (var multi = connection.QueryMultiple("get_GoalAndAllChildObjects", new {goal_id=m_goal_id})) {
    var goal = multi.Read<Goal>();
    var subgoals = multi.Read<SubGoal>();
}

接下来是批量更新大数据。您可以通过表参数插入来做到这一点(我在这里写了一篇文章:http ://www.altdevblogaday.com/2012/05/16/sql-server-high-performance-inserts/ )。基本上,您为要插入的每种类型的数据创建一个表,然后编写一个将这些表作为参数并将它们写入数据库的过程。

这是超高性能,几乎可以得到优化,而且代码不是太复杂。

但是,我需要问:保持“子目标”和所有其他对象的关系有什么意义吗?一种简单的替代方法是创建一个 XML 或 JSON 文档,其中包含您的目标及其所有序列化为文本的子对象,然后将该对象保存到文件系统中。它具有令人难以置信的高性能,非常简单,非常可扩展,并且只需要很少的代码。唯一的缺点是您不能编写一个 SQL 语句来浏览所有子目标。考虑一下 - 这可能值得考虑;)

于 2012-08-21T05:10:03.020 回答