1

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

参见示例 在 Dapper 中正确使用多重映射

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

4

2 回答 2

2

不要这样做。千万不要这样想!数据库是持久的和规范化的。对象是易腐烂的并且经常是非规范化的,当您编写 SQL 时,在两者之间进行转换是一件需要深思熟虑的事情。这真的不是自动化的步骤。漫长而痛苦的经历使我们中的许多人相信,数据库抽象(表和连接)不应该仅仅被吸入(或生成)代码。如果您还不确定,请使用已建立的 ORM。

另一方面,如果您绝对想控制您的 SQL,但它在 C# 中的字符串文字中的“嵌入”会困扰您,那么我完全同意。我可以建议QueryFirst 吗,这是一个 Visual Studio 扩展,可为您的查询生成 C# 包装器。您的 SQL 保留在一个真正的 SQL 文件中,经过语法验证,检查了数据库引用,并且在每次保存时,QueryFirst 都会生成一个带有 Execute() 方法的包装类,并为结果生成一个 POCO。

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

因此,对于客户及其订单的图表...在父 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 行代码,不包括括号,你有一个嵌套图,你喜欢延迟加载或急切加载,在代码中可发现接口(输入参数和结果的智能感知)。它们可能是这些表中的数百列,您永远不需要重新键入其名称,并且其数据类型将透明地流入您的 C#。

清晰的职责分离。全面控制。免责声明:我写了 QueryFirst :-)

于 2016-11-15T11:20:03.417 回答
0

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

在这个问题的上下文中,Multimapping 甚至不相关,回复:您正在寻求一种从给定对象自动生成 SQL 查询并创建正确连接的方法,这将导致单个 SQL 查询与多重映射。

我怀疑您正在寻找的是实体框架的内容。您可能想要研究几个 Dapper 扩展项目,它们会生成一些 SQL。参见:Dapper.Rainbow VS Dapper.Contrib

于 2016-11-14T19:01:52.470 回答