Добавление многопользовательских детей в родительский с Dapper - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть очень простой тестовый проект, в котором я пытаюсь выяснить, как добавить детей в коллекцию родителей.

Модель данных довольно проста:

enter image description here

Текущий результат возвращает дублированную запись. enter image description here

Ожидаемый / желаемый

Я ожидал, что результатом будет всего одна запись с двумя детьми

GROUP1 -> {USER_1, USER_2}

ГРУППОВОЙ класс

public class GROUP
{
    public GROUP()
    {
        this.USERs = new HashSet<USER>();
    }

    public int Group_ID { get; set; }
    public string Name { get; set; }
    public string Location { get; set; }
    public ICollection<USER> USERs { get; set; }
}

класс ПОЛЬЗОВАТЕЛЯ

public class USER
{
    public int User_ID { get; set; }
    public int Group_ID { get; set; }
    public string Name { get; set; }
    public Nullable<int> Age { get; set; }

    public GROUP GROUP { get; set; }
}

Метод Даппера

public GROUP Get(int id)
{
    string sqlGetGroupExtended = $"SELECT _group.Group_ID, _group.Name, _group.Location, _user.User_ID, _user.Name, _user.GROUP_ID, _user.Age FROM dbo.[GROUP] _group " +
                                        "LEFT JOIN dbo.[USER] _user ON _group.Group_ID = _user.Group_ID " +
                                        "WHERE _group.Group_ID = @groupid;";

    GROUP result = null;
    var lookup = new Dictionary<int, GROUP>();

    using (var connection = new SqlConnection(Properties.Settings.Default.CodeTest_DB))
    {
        var extendedGroup = connection.Query<GROUP, USER, GROUP>(sqlGetGroupExtended, (parent, child) =>
        {
            if (!lookup.TryGetValue(parent.Group_ID, out GROUP found))
            {
                lookup.Add(parent.Group_ID, found = parent);
            }
            found.USERs.Add(child);
            return found;
        }, param: new { groupid = id }, splitOn: "Location");

        // result = extendedGroup  <--- WHAT TO DO HERE?
    }

    return result;
}

Как мне этого добиться?

Ссылки:

http://dapper -tutorial.net / щеголеватый https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/MultiMapTests.cs#L12

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Если вы используете SQL Server 2016 или Azure SQL, вы можете воспользоваться JSON, чтобы вернуть иерархический объект:

https://medium.com/dapper-net/one-to-many-mapping-with-dapper-55ae6a65cfd4

Это статья, которую я написал на эту тему, вместе с исходным кодом, которая показывает, как элегантно решить проблему.

0 голосов
/ 07 сентября 2018

Мой плохой, как показывает код здесь https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/MultiMapTests.cs#L12

Мне не хватало .Distinct()

var extendedGroup = connection.Query<GROUP, USER, GROUP>(sqlGetGroupExtended, (parent, child) =>
{
    if (!lookup.TryGetValue(parent.Group_ID, out GROUP found))
    {
        lookup.Add(parent.Group_ID, found = parent);
    }
    found.USERs.Add(child);
    return found;
}, param: new { groupid = id }, splitOn: "Location,User_ID").Distinct();
...