Удивительный множественный выбор: первичный ключ вложенного класса не отображается, если не используется "AS" - PullRequest
3 голосов
/ 15 июля 2011

У меня есть два класса:

class Foo{
    public int FooId { get; set; }
    ...
    public Bar Bar { get; set }
}

class Bar{
    public int BarId { get; set; }
    public int FooId { get; set }
    ...
}

когда я запускаю запрос следующим образом:

sqlConnection.Query<Foo, Bar, Foo>(
    "SELECT * FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId",
    (foo, bar) => { 
         foo.Bar = bar;
         return foo; 
       }, 
    splitOn: "FooId");

В результате все свойства в Foo и Bar будут отображаться, за исключением Bar.BarId. После проверки имени столбца и ввода в базу данных по моему классу Bar я все еще не смог найти никаких отличий.

Одна странная вещь, на которую я наткнулся, заключалась в том, что если бы я написал:

"SELECT *, BarId AS BarId FROM Foo JOIN Bar ON Foo.FooId = Bar.FooId"

Bar.BarId на самом деле отображается, как и ожидалось, я неправильно понял, как использовать Dapper или это ошибка?

1 Ответ

6 голосов
/ 15 июля 2011

Он пытается разделить на FooId, поэтому каждый раз, когда он видит FooId, он обрезает данные.Этот сценарий использования по существу предназначен для (не редкого) сценария, когда все таблицы имеют предсказуемый ключ, такой как Id.В вашем случае это не то, что вы хотите, как вы получаете из базы данных:

FooId, a, b, c | BarId, FooId, x, y, z
^^ from Foo ^^ | ^^ from Bar ^^

Однако, это делится на FooId как:

FooId, a, b, c, BarId | FooId, x, y, z

, поэтому BarId не включается во второй объект, а также почему его добавление в конец делает его работу.

Существует еще одно использование, IIRC, которое принимает секвенированные ключи для разделенияна;вы бы использовали:

splitOn: "FooId,BarId"
...