我正在使用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:
的参数。另外,类型应该是 ,还是?
我已经解决了我的问题,我没有删除这个问题,而是把答案留在这里,因为我花了很多时间去砸,我很努力的为你们做这个牛肉抽象。
首先,存储过程的结果集要有更好的列名。
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.