精巧的教程提供了此示例,以帮助用户进行多映射(一对多)。尽管如此,我很好奇为什么他们将订单存储在字典中,但是最后他们使用linq.Distinct()并从中返回列表。似乎只返回ordersDictionary.Values会更干净,因为字典逻辑可确保没有重复。
//Tutorial
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
Dictionary<int,Order> orderDictionary = new Dictionary<int, Order>();
List<Order> list = connection.Query<Order, OrderDetail, Order>(sql, (order, orderDetail) =>
{
if (!orderDictionary.TryGetValue(order.OrderID, out Order orderEntry))
{
orderEntry = order;
orderEntry.OrderDetails = new List<OrderDetail>();
orderDictionary.Add(orderEntry.OrderID, orderEntry);
}
orderEntry.OrderDetails.Add(orderDetail);
return orderEntry;
}, splitOn: "OrderID")
.Distinct()
.ToList();
return list;
}
//my suggestion
using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
{
Dictionary<int,Order> orderDictionary = new Dictionary<int, Order>();
//change 1 no need to store into list here
connection.Query<Order, OrderDetail, Order>(sql, (order, orderDetail) =>
{
if (!orderDictionary.TryGetValue(order.OrderID, out Order orderEntry))
{
orderEntry = order;
orderEntry.OrderDetails = new List<OrderDetail>();
orderDictionary.Add(orderEntry.OrderID, orderEntry);
}
orderEntry.OrderDetails.Add(orderDetail);
return orderEntry;
}, splitOn: "OrderID"); //change 2 remove .Distinct().ToList()
return orderDictionary.Values.ToList(); //change 3 return dictionaryValues
}
我是本教程的作者:https : //dapper-tutorial.net/query#example-query-multi-mapping-one-to-many
他们为什么要把订单存储在字典中
每行返回一行OrderDetail
。因此,您要确保将添加OrderDetail
到现有文件,Order
而不是为每个文件创建一个新文件OrderDetail
。该词典用于性能检查是否Order
已创建。
只返回ordersDictionary.Values会更干净
您的查询将如何返回字典值?
当然,如果您采用的是自己的方法,则可以
var list = orderDictionary.Values;
return list;
但是如何使这个Connection.Query
返回字典值呢?每行/都会返回一个订单OrderDetail
,因此该订单将被多次返回。
在之外Query
,您的字典解决方案很好用,甚至是更好的性能解决方案,但是如果您想Query
不使用Distinct
或使用类似方法使返回的订单明细列表不可行,那是不可能的。
编辑:回答评论
我的建议返回orderDictionary.Values.ToList(); //更改3个返回的dictionaryValues
谢谢您的宝贵意见,我们将不胜感激;)
在教程中使用无关系时使用查询返回的内容,而将字典用于one to many
关系将是很奇怪的
// no relationship
var orders = conn.Query<Order>("", ...).Distinct();
// one to many relationship
conn.Query<Order, OrderDetail>("", ...);
var orders = orderDictionary.Values.ToList();
您的解决方案在使用方式上会更好地提高性能,这是毫无疑问的。但这是人们通常使用的Query
方法:
var orders = conn.Query("", ...).Distinct();
var activeOrders = orders.Where(x => x.IsActive).ToList();
var inactiveOrders = orders.Where(x => !x.IsActive).ToList();
他们使用Query
方法返回的内容。
但是同样,您的操作方式没有错,如果您可以做到,那就更好了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句