如何使用结果映射将简洁的结果转换为字典

Par*_*roX 5 c# sql-server dictionary dapper

我想使用此处表示的 splitOn 功能:https ://dapper-tutorial.net/result-multi-mapping

将结果的每个订单分组到整数属性“EmployeeId”。我遵循了如何使用 Dapper Dot Net 从数据库结果映射到字典对象?

但我收到了,An item with the same key has already been added.那么如何按 EmployeeId 对我的订单进行分组?

我无法修改该类Order,而且我更喜欢使用字典而不是创建包装 Order 的类。但是,如果没有其他方法,我愿意接受包装订单的想法

https://dotnetfiddle.net/hn6Sjf

public class Program
{
    public class Order
    {
        public int OrderID { get; set; }
        public int CustomerID { get; set; }
        public DateTime OrderDate  { get; set; }
        public int ShipperID  { get; set; }
    }

    public static void Main()
    {
        string sql = @"
            SELECT TOP 10
                EmployeeID,
                OrderID,
                CustomerID,
                OrderDate,
                ShipperID
            FROM Orders 
            ORDER BY OrderID;
        ";

        using (var connection = new SqlConnection(FiddleHelper.GetConnectionStringSqlServerW3Schools()))
        {           
            var rawList = connection.Query<Order>(sql);
            FiddleHelper.WriteTable(rawList);   


                var dict = connection.Query<int, List<Order>, KeyValuePair<int, List<Order>>>(sql,
                    (s, i) => new KeyValuePair<int, List<Order>>(s, i), null, null, true, "OrderID")
                    .ToDictionary(kv => kv.Key, kv => kv.Value);

            FiddleHelper.WriteTable(dict);              
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

jir*_*ira 1

这能满足您的需求吗?

var dict = connection.Query<int, Order, ValueTuple<int, Order>>(sql,
        (s, i) => ValueTuple.Create(s, i), null, null, true, "OrderID")
        .GroupBy(t => t.Item1, t => t.Item2, (k, v) => new {Key = k, List = v})
        .ToDictionary(kv => kv.Key, kv => kv.List);
Run Code Online (Sandbox Code Playgroud)

小提琴