我有这些相关的类,它们也是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;
}
}