Это может быть связано с тем, что я изменил API и забыл обновить документацию. Я исправил ошибку.
Обязательно ознакомьтесь с Tests.cs для получения полной обновленной спецификации.
В частности, старый API, использовавшийся для сопоставления Action<T,U>
, проблема заключалась в том, что он был произвольным и негибким. Вы не могли полностью контролировать тип возвращаемого значения. Новые API принимают Func<T,U,V>
. Таким образом, вы можете контролировать тип, который вы возвращаете из картографа, и он не обязательно должен быть картографическим типом.
Я только что связал некоторую дополнительную гибкость с мультикартированием, этот тест должен прояснить:
class Person
{
public int PersonId { get; set; }
public string Name { get; set; }
}
class Address
{
public int AddressId { get; set; }
public string Name { get; set; }
public int PersonId { get; set; }
}
class Extra
{
public int Id { get; set; }
public string Name { get; set; }
}
public void TestFlexibleMultiMapping()
{
var sql =
@"select
1 as PersonId, 'bob' as Name,
2 as AddressId, 'abc street' as Name, 1 as PersonId,
3 as Id, 'fred' as Name
";
var personWithAddress = connection.Query<Person, Address, Extra, Tuple<Person, Address,Extra>>
(sql, (p,a,e) => Tuple.Create(p, a, e), splitOn: "AddressId,Id").First();
personWithAddress.Item1.PersonId.IsEqualTo(1);
personWithAddress.Item1.Name.IsEqualTo("bob");
personWithAddress.Item2.AddressId.IsEqualTo(2);
personWithAddress.Item2.Name.IsEqualTo("abc street");
personWithAddress.Item2.PersonId.IsEqualTo(1);
personWithAddress.Item3.Id.IsEqualTo(3);
personWithAddress.Item3.Name.IsEqualTo("fred");
}
Dapper передает все API-интерфейсы многократного отображения с помощью одного метода, поэтому, если что-то не получается, оно заканчивается в 6 параметрах. Другая часть головоломки заключалась в том, что я не учел некоторые сверхгибкие разбиения, которые я только что добавил.
Обратите внимание, что для параметра splitOn
по умолчанию будет Id
, то есть в качестве границы первого объекта будет принят столбец с именем id
или Id
. Однако если вам нужны границы для нескольких первичных ключей, которые имеют разные имена, например, для «трехстороннего» многократного отображения, теперь вы можете передать список через запятую.
Так что, если бы мы исправили вышесказанное, вероятно, сработало бы следующее:
var student = _conn.Query<Student,Address,Student>
("SELECT s.*, a.* FROM dbo.Student s
INNER JOIN dbo.Address a ON s.AddressID = a.AddressID
WHERE s.StudentenID = @Id",
(stu, adr) => { stu.PrimaryAddress = adr; return stu;},
new { Id = 4711 }, splitOn: "AddressID").FirstOrDefault();