有没有办法在Dapper中以通用方式使用多重映射,而不使用C#代码中嵌入的自定义SQL?
参见例如 Correct use of Multimapping in Dapper
是否有通用的方法来查询来自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