我如何使用Dapper将多个左外连接映射到继承对象?

问题描述 投票:1回答:1

我正在使用Dapper,并试图生成一个包含3个类的列表,其中2个是继承类,1个是基类。这些类是

public class Cow
{
    public int Id { get; set; }
    public string Name { get; set; }
}
public class Steak: Cow
{
    public int DonenessId { get; set; }
}
public class Jerky: Cow
{
    public int MarinadeId { get; set; }
}

我的存储过程没有任何参数,使用左外连接。

SELECT *  FROM Cow c
LEFT OUTER JOIN dbo.Jerky j ON j.CowId = c.Id
LEFT OUTER JOIN dbo.Steak s ON s.CowId = c.Id

=

+----+----------+------+-------+------------+------+-------+------------+
| Id | Name     | Id   | CowId | MarinadeId | Id   | CowId | DonenessId |
+-----------------------------------------------------------------------+
| 1  | Artricia | NULL | NULL  | NULL       | 21   |   1   | 5          |
+-----------------------------------------------------------------------+
| 2  | Betty    | 13   | 2     | 3          | NULL | NULL  | NULL       |
+-----------------------------------------------------------------------+
| 3  | Cindy    | 14   | 3     | 1          | NULL | NULL  | NULL       |
+-----------------------------------------------------------------------+
| 4  | Denile   | NULL | NULL  | NULL       | NULL | NULL  | NULL       |
+-----------------------------------------------------------------------+
| 5  | Enid     | NULL | NULL  | NULL       | 22   | 5     | 3          |
+----+----------+------+-------+------------+------+-------+------------+

我试图生成一个Cow对象的列表,以便我可以循环浏览它们,我需要使用Dapper进行组织,并且我需要在一个存储过程中使用它。

从上面的结果来看,我希望得到一个包含5个Cow对象的列表,其中2个可以投递为Steak,2个可以投递为Jerky。

编辑:完善了我的要求。

我被卡住了,因为我不知道该把什么放在 map: 的参数。另外,类型应该是 ,还是?

.net oop dapper
1个回答
0
投票

我已经解决了我的问题,我没有删除这个问题,而是把答案留在这里,因为我花了很多时间去砸,我很努力的为你们做这个牛肉抽象。

首先,存储过程的结果集要有更好的列名。

SELECT 
c.Id AS Id, 
c.Name AS Name,
j.Id AS JerkyId,
j.MarinadeId AS JerkyMarinadeId,
s.Id AS SteakId,
s.DonenessId AS SteakDonenessId
FROM Cow c
LEFT OUTER JOIN dbo.Jerky j ON j.CowId = c.Id
LEFT OUTER JOIN dbo.Steak s ON s.CowId = c.Id

既然现在有了唯一命名的列,将连接分开,我们就可以splitOn。

var lookup = new Dictionary<int, Cow>();
_dbConnection.Query<Cow, Jerky, Steak, Cow>(QueryConstants.MeatDetective,
    (c, j, s) =>
    {
        Cow cow;
        if (!lookup.TryGetValue(c.Id, out cow))
        {
            if (s != null)
            {
                s.Id = c.Id;
                s.Name = c.Name;
                lookup.Add(c.Id, s);
            }
            else if (j != null)
            {
                j.Id = c.Id;
                j.Name = c.Name;
                lookup.Add(c.Id, j);
            }
            else
            {
                lookup.Add(c.Id, c);
            }
        }

        return cow;
    }, splitOn: "JerkyId,SteakId");
    var beef = lookup.Values.ToList();

    Console.WriteLine("Cows  : " + beef.Count() + ".");
    Console.WriteLine("Steaks: " + beef.OfType<Steak>().Count() + ".");
    Console.WriteLine("Jerkys: " + beef.OfType<Jerky>().Count() + ".");

我们可以splitOn: Produces:

Cows  : 5.
Steak : 2.
Jerky : 2.
© www.soinside.com 2019 - 2024. All rights reserved.