扩展方法是否是使用Dapper延迟加载类的合理方法?

时间:2016-03-07 23:17:41

标签: c# design-patterns dapper

我有这些相关的类,它们也是SQL中的表:Board和BoardItemsNeeded我想知道使用Extension方法是否是一种可选择加载子对象的合理方法:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using Dapper;
using Dapper.Contrib.Extensions;

[Table("board")]
public partial class Board
{
    [Key]
    public int id { get; set; }
    public int CustomerCuid { get; set; }
    public string ProjectName { get; set; }
    public DateTime CreateDate { get; set; }
    public short SalesEmployeeId { get; set; }
    public DateTime? LastModifiedDate { get; set; }

    public IEnumerable<BoardItemsNeeded> BoardItemsNeeded { get; set; }

    public Board GetById(int id)
    {
        using (IDbConnection cn = new SqlConnection(g.Global.CONX))
        {
            cn.Open();
            return cn.Get<Board>(id);
        }
    }
}

public static class ExtensionMethods
{
    public static Board Deep(this Board value)
    {
        using (IDbConnection cn = new SqlConnection(g.Global.CONX))
        {
            cn.Open();
            value.BoardItemsNeeded = cn.Query<BoardItemsNeeded>("SELECT * FROM board_items_needed WHERE BoardId = @id ", new { @id = value.id });
        }
        return value;
    }
}

[Table("board_items_needed")]
public partial class BoardItemsNeeded
{
    [Key]
    public int id { get; set; }
    public int BoardId { get; set; }
    public short ItemType { get; set; }
    public decimal Size { get; set; }
    public string Color { get; set; }
}

我可以像这样访问完整的对象:

var board = new Board();
board = board.GetById(2).Deep();

我正在搞乱接口,泛型和存储库,然后又回到了这样的事情。我正在尝试为我正在使用的数据库中的各种业务类开发一个小模式。代替扩展方法,我想我可以在Board类下创建另一个方法来实现它。我不确定我是否正确接近事情。我想在提交模式之前做到正确。

编辑:我尝试使用Dapper的多映射和多个结果,但我无法理解前者的语法,而后者似乎过于宽泛,不像sql join。

更新:我最终没有使用扩展方法,而是创建了另一个深度加载的对象方法。它使用2个db调用,因为看起来Dapper似乎不能像Entity Framework那样执行此操作。我没意见。与手动映射每个属性相比,这仍然少得多。

    public Board GetByIdDeep(int id)
    {
        using (IDbConnection cn = new SqlConnection(g.Global.CONX))
        {
            cn.Open();
            var board = cn.Query<Board>("SELECT * FROM board where id = @Id", new { Id = id }).FirstOrDefault();
            var items = cn.Query<BoardItemsNeeded>("SELECT i.* from board b INNER JOIN board_items_needed i ON i.BoardId = b.id where b.id = @Id", new { Id = id });
            board.BoardItemsNeeded = items;
            return board;
        }
    }

0 个答案:

没有答案