有小巧玲珑的回零加盟

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

我有以下类别:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Department { get; set; }
    public List<Event> Events { get; set; }
}

public class Event
{
    public int Id { get; set; }
    public int UserId { get; set; }
    public string EventText { get; set; }
    public string StartTime { get; set; }
    public string EndTime { get; set; }
    public string Day { get; set; }
    public string ColorIdentifier { get; set; }
    public int Week { get; set; }
}

我试图让所有的用户和他们有小巧玲珑像这样的活动:

var sql = "SELECT u.Id, e.UserId, e.EventText FROM cpc.PLANNING_TOOL_USERS u  LEFT JOIN cpc.PLANNING_TOOL_EVENTS e ON u.Id=e.UserId";
var result = SqlMapper.Query<User, Event, User>(connection, sql, (u, e) =>
{
   if (u.Events == null)
      u.Events = new List<Event>();
   u.Events.Add(e);

   return u;

}, splitOn: "Id, UserId");

用户ID是返回,但不填充事件的列表。我已经在这里看到堆栈溢出的例子很多关于这一点,但我看不到我在做什么错。

c# sql dapper
1个回答
1
投票

为了省略SQL没有返回数据我刚才嘲笑与SQL union两个用户行的情况。与User和一个Id=1,并EventUser和两个Id=2s Event

SqlMapper.Query返回是最好的1对1的关系平的结果。你有一个用户的许多事件的关系,所以要保持这种关系作为直通结果的映射需要一些辅助存储。我已经使用.NET字典这一点。

我下面的代码示例:

        // introducing temporary storage
        var usersDictionary = new Dictionary<int, User>();

        var sql = @"SELECT 1 Id, 1 UserId, 'EventText1' EventText
                  union SELECT 2 Id, 2 UserId, 'EventText2'  EventText
                  union SELECT 2 Id, 2 UserId, 'Another EventText2' EventText";
        var result = SqlMapper.Query<User, Event, User>(connection, sql, (u, e) =>
        {
            if (!usersDictionary.ContainsKey(u.Id))
                usersDictionary.Add(u.Id, u);
            var cachedUser = usersDictionary[u.Id];

            if (cachedUser.Events == null)
                cachedUser.Events = new List<Event>();
            cachedUser.Events.Add(e);

            return cachedUser;

        }, splitOn: "UserId");

        // we are not really interested in `result` here
        // we are more interested in the `usersDictionary`

        var users = usersDictionary.Values.AsList();
        Assert.AreEqual(2, users.Count);
        Assert.AreEqual(1, users[0].Id);
        CollectionAssert.IsNotEmpty(users[0].Events);
        Assert.AreEqual(1, users[0].Events.Count);
        Assert.AreEqual("EventText1", users[0].Events[0].EventText);
        Assert.AreEqual(2, users[1].Events.Count);

我希望帮你解决你的映射问题和事件是null

© www.soinside.com 2019 - 2024. All rights reserved.