Проблема с разделением с использованием внутреннего соединения dapper.net

У меня есть следующий SQL-запрос, который выполняется через dapper.net

  var resultList = sqlCon.Query<UserProfile, UserAddress, UserProfile>(@"

                            UPDATE [User].[User_Profile]
                                SET ProfileStatus = 4
                            WHERE Id = @UserId

                            SELECT u.Id [UserId], u.Username, u.Age,
                                   u.ProfileStatus,
                                   a.Id [AddressId], a.Country, a.[State], a.City,
                                   a.Latitude, a.Longitude
                            FROM [User].[User_Profile] u
                            INNER JOIN [User].[User_Address] a on u.id = a.UserId
                            WHERE u.Id = @UserId", (u, a) =>
                            {
                                u.Id = a.UserId;
                                return u;
                            },
                            new { UserId = userId }, splitOn: "UserId").FirstOrDefault();

Я получаю эту ошибку при запуске:

При использовании API с несколькими сопоставлениями убедитесь, что вы установили параметр splitOn, если у вас есть ключи, отличные от Id», «splitOn».

Мои два класса следующие:

во-первых, это userProfile, который я пытаюсь заполнить

 public class UserProfile
{
    public Int64 UserId { get; set; }

    public string UserName { get; set; }

    public int Age { get; set; }

    public int ProfileStatus { get; set; }

    public Int64 AddressId { get; set; }

    public int Country { get; set; }

    public int State { get; set; }

    public int City { get; set; }

    public decimal Latitude { get; set; }

    public decimal Longitude { get; set; }
}

и это мой класс адресов пользователей:

 public class UserAddress
{
    public Int64 Id { get; set; }

    public Int64 UserId { get; set; }

    public int Country { get; set; }

    public int State { get; set; }

    public int Town { get; set; }

    public string PostCode { get; set; }

    public decimal Latitude { get; set; }

    public decimal Longitude { get; set; }
}

Я не уверен, что я делаю неправильно, поскольку я думаю, что сказал разделить идентификатор пользователя? но ясно, что это не так?

** Обновлять **

Обновите оператор sql с псевдонимом

                            SELECT u.Id as [UserId], u.Username as [Username], u.Age as [Age],
                                   u.ProfileStatus as [ProfileStatus], 
                                   a.Id as [AddressId], a.Country as [Country], a.[State] as [State],
                                   a.City as [City], a.Latitude as [Latitude], a.Longitude as [Longitude]
                            FROM [User].[User_Profile] u
                            INNER JOIN [User].[User_Address] a on u.id = a.UserId
                            WHERE u.Id = @UserId", (u, a) =>
                            {
                                u.UserId = a.UserId;
                                return u;
                            },
                            new { UserId = userId }, splitOn: "AddressId").FirstOrDefault();

person Code Ratchet    schedule 16.04.2015    source источник
comment
SplitOn неверно, потому что UserId — это первый столбец в вашем запросе. Вы должны указать столбец, который отделяет первую таблицу/класс от второй. Кажется, это AddressId, не так ли?   -  person Tim Schmelter    schedule 16.04.2015
comment
Давненько я не работал с Dapper, но не следует ли вместо этого разделить по AddressId?   -  person rikitikitik    schedule 16.04.2015


Ответы (1)


SplitOn неверно, потому что UserId — это первый столбец в вашем запросе. Вы должны указать столбец, который отделяет первую таблицу/класс от второй, поэтому первый столбец/псевдоним не принадлежит таблице User_Profile, но User_Address.

Кажется, это AddressId.

// ...
new { UserId = userId }, splitOn: "AddressId").FirstOrDefault();
person Tim Schmelter    schedule 16.04.2015
comment
спасибо, кажется, что это сработало, проблема в том, что теперь он не возвращает детали адреса, когда я беру этот запрос и запускаю его в SQL, я получаю правильные результаты, можете ли вы увидеть, что может вызвать ошибку? - person Code Ratchet; 16.04.2015
comment
это также не возвращает userId, в соответствии с моим классом профиля пользователя после запуска единственными значениями, которые у меня есть, являются Age, ProfileStatus и Username - person Code Ratchet; 16.04.2015
comment
@ScottAtkinson: я думаю, причина в ваших псевдонимах. Они должны иметь то же имя, что и ваши свойства. Есть обходные пути для этой проблемы. stackoverflow.com/a/9481901/284240 - person Tim Schmelter; 16.04.2015
comment
Я только что прошел и добавил псевдоним для каждого возвращаемого столбца, но все еще получаю ту же проблему, я добавил обновленный код - person Code Ratchet; 16.04.2015