Dapper一对多映射逻辑

tstrand66

精巧的教程提供了此示例,以帮助用户进行多映射(一对多)。尽管如此,我很好奇为什么他们将订单存储在字典中,但是最后他们使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章