在没有自定义SQL的Dapper中进行多映射

时间:2016-11-14 18:53:35

标签: dapper multi-mapping

有没有办法在Dapper中以通用方式使用多重映射,而不使用C#代码中嵌入的自定义SQL?

参见例如 Correct use of Multimapping in Dapper

是否有通用的方法来查询来自2个相关实体的数据,其中自动确定公共字段以进行连接?

2 个答案:

答案 0 :(得分:1)

不要这样做。甚至不要这么想!数据库持久且标准化。对象易腐烂且经常被非规范化,当你编写SQL时,在两者之间进行转换是需要考虑的事情。这实际上不是自动化的一步。漫长而痛苦的经历使我们许多人相信,数据库抽象(表和连接)不应仅仅被吸入(或生成)代码。如果您还不相信,那么请使用已建立的ORM。

另一方面,如果你绝对希望控制你的SQL,但它在C#中的字符串文字中“嵌入”会让你感到烦恼,那么我不能同意。我可以建议QueryFirst,一个可视化工作室扩展,为您的查询生成C#包装器。您的SQL保留在一个真实的SQL文件中,验证了语法,检查了数据库引用,并且在每次保存时,QueryFirst都会生成一个包含Execute()方法的包装类,以及一个用于结果的POCO。

通过多映射,我假设您要填充嵌套对象的图形。一个很好的方法是在图中为每个类使用一个QueryFirst .sql,然后在父类的部分类中添加List个子类。 (QueryFirst生成的POCO分为两个部分类,您可以控制其中一个,该工具会生成另一个。)

所以,对于客户及其订单的图表...... 在父sql中

select * from customers where name like @custName

子sql

select * from orders where customerId = @customerId

在父部分类中,用于急切加载......

    public List<Orders> orders;
    public void OnLoad()
    {
        orders = new getOrders().Execute(customerId); // property of the parent POCO
    }

或延迟加载...

    private List<Orders> _orders;
    public List<Orders> orders
    {
        get
        {                
            return _orders ?? _orders = new GetOrders().Execute(customerId);                
        }
    }

5行代码,不包括括号,你有一个嵌套图,延迟加载或急切加载,你可以在代码中找到接口(输入参数和结果的intellisense)。它们可能在这些表中有数百列,其名称永远不需要重新键入,并且其数据类型将透明地流入您的C#。

清洁责任分离。完全控制。免责声明:我写过QueryFirst: - )

答案 1 :(得分:0)

使用Dapper进行多重映射是一种运行多个SQL查询的方法,然后返回映射到特定对象的每个结果。

在这个问题的上下文中,Multimapping甚至不相关,re:您要求从给定对象自动生成SQL查询并创建正确的连接,这将导致单个SQL查询这与Multimapping无关。

我怀疑你正在寻找的是实体框架的内容。您可能需要查看几个Dapper扩展项目,这些项目将生成一些SQL。请参阅:Dapper.Rainbow VS Dapper.Contrib