【发布时间】:2012-01-25 12:05:50
【问题描述】:
我正在尝试用一些简洁的查询替换讨厌的 LINQ 2 SQL 命中,以提高性能。这样做时,我必须将一堆不同的对象编织在一起,以便创建一个大对象来保存我需要的所有 ASN 信息。
我目前遇到的问题是一个抽象类 Orders,这个类是由两个单独的类 AutionOrder 和 MerchantOrder 使用鉴别器属性实现的。
由于我不能使用 dapper 创建一个抽象类的对象,我改用其中一个公共类。但是,当它去构建对象时,它在GetSettableProps 内部失败,它正在寻找正确的DeclaringType,但GetProperty 方法在寻找internal 或@987654326 的属性时返回null @。我尝试使用t.BaseType.GetProperty 和p.GetAccessors().First().GetBaseDefinition().DeclaringType.GetProperty(p.Name).GetSetMethod(true) 破解它,但没有成功。
虚拟对象:
订购
OrderID、名称、地址、RowVersion(internal)、Shipments(EntitySet)、OrderDetails(EntitySet)、Customer(EntityRef)
发货
ShipmentID、OrderID、TrackingNumber
订单详情
OrderDetailID、OrderID、产品、数量、价格
客户
客户 ID、姓名、
对于这个特定的 SQL 命中,我正在尝试获取一些我需要的一对一关系映射。
SELECT o.* from Orders as o left join Customers as c on o.CustomerID = c.CustomerID where o.OrderID in (1,2,3);
这就是我用来利用 dapper 并让它发挥神奇作用的方法:
using (var connection = new SqlConnection(_ConnectionString))
{
connection.Open();
results = connection.Query<MerchantOrder, MerchantCustomer, MerchantOrder>(sql.ToString(),
(o, c) => { o.Customer = c; return o; },
splitOn: "CustomerID");
}
如果我将 Order 更改为公共课程,这个问题就会消失,但这不是预期的副作用。尝试为 RowVersion 设置 propInfo 时失败 - 将其切换为 public 而不是 internal 解决了这个问题 - 尽管不需要。但是当它试图为 Order 创建 Shipments 对象时它会失败。同样,当 Order 是公共类时,这些都不是问题。
此外,我正在执行单独的查询以引入多对一关系,例如 Shipments 到 Orders 和 OrderDetails 到 Orders 并将结果规范化为适当的 Order 对象。 MerchantOrder 几乎是一个没有真正特殊逻辑的空类。这里的区别在于我们最终如何找到在实际 SQL 命中之前抽象出来的 CustomerID。
我还在使用截至 2011 年 12 月 20 日的最新版本的 dapper。
我真的很喜欢小巧玲珑,但这个问题让我头疼 - 所以感谢您的帮助!
【问题讨论】:
-
您可以添加一个失败的测试以便我解决这个问题吗?只需提交一个补丁即可
-
我添加了一个失败测试@code.google.com/r/johnzaborow-fail-test 我在自动推送我的更改时遇到了很多问题,所以我一个一个地做了。让我知道是否需要更改任何内容。谢谢!
标签: c# .net reflection abstract-class dapper