Dapper 多映射错误
Dapper multi-mapping error
我正在努力让多映射在 dapper 中工作。
这是我的代码:
var contactDictionary = new Dictionary<Guid, Contact>();
IEnumerable<Contact> contacts = connection.Query<Contact, Activity, Contact>(
@"SELECT ContactId, Title, FirstName, Surname,
AddressType.Type AS AddressType, Address.AddressLine1, Address.AddressLine2, Address.AddressLine3, Address.Town, Address.County, Address.Country, Address.Postcode,
EmailAddressType.Type AS EmailAddressType, EmailAddress.Email AS EmailAddress,
PhoneNumberType.Type As PhoneNumberType, PhoneNumber.Number AS PhoneNumber,
Direction.Type AS Direction, Activity.Summary, Activity.DateCompleted
FROM Contact
LEFT JOIN Address ON Contact.ContactPK = Address.ContactPK
LEFT JOIN AddressType ON Address.AddressTypePK = AddressType.AddressTypePK
LEFT JOIN EmailAddress ON Contact.ContactPK = EmailAddress.ContactPK
LEFT JOIN EmailAddressType ON EmailAddress.EmailAddressTypePK = EmailAddressType.EmailAddressTypePK
LEFT JOIN PhoneNumber ON Contact.ContactPK = PhoneNumber.ContactPK
LEFT JOIN PhoneNumberType ON PhoneNumber.PhoneNumberTypePK = PhoneNumberType.PhoneNumberTypePK
LEFT JOIN Activity ON Contact.ContactPK = Activity.ContactPK
LEFT JOIN Direction ON Activity.DirectionPK = Direction.DirectionPK
WHERE Contact.ContactId = @ContactId
AND Address.IsPrimary = 1 AND EmailAddress.IsPrimary = 1 AND PhoneNumber.IsPrimary = 1",
param:new { ContactId = contactId },
map:(c, a) =>
{
Contact contactEntry;
if (!contactDictionary.TryGetValue(c.ContactId, out contactEntry))
{
contactEntry = c;
contactEntry.Activities = new List<Activity>();
contactDictionary.Add(contactEntry.ContactId, contactEntry);
}
contactEntry.Activities.Add(a);
return contactEntry;
},
splitOn: "ContactId")
.Distinct()
.ToList();
这是 SSMS 中 运行 时 SQL 的结果:
这是我在执行代码时遇到的错误:
使用多映射 API 时,如果您有 Id 以外的键,请确保设置 splitOn 参数
参数名称:splitOn
我真的很困惑,因为我以为我指定了 splitOn 参数?
如有任何帮助,我们将不胜感激。
splitOn 参数应指示 dapper 如何将属性与两个实体(联系人和 Activity)分开,您应将其设置为 activity 的第一个 属性(假设您属性在 SQL 语句中排序)。
我正在努力让多映射在 dapper 中工作。
这是我的代码:
var contactDictionary = new Dictionary<Guid, Contact>();
IEnumerable<Contact> contacts = connection.Query<Contact, Activity, Contact>(
@"SELECT ContactId, Title, FirstName, Surname,
AddressType.Type AS AddressType, Address.AddressLine1, Address.AddressLine2, Address.AddressLine3, Address.Town, Address.County, Address.Country, Address.Postcode,
EmailAddressType.Type AS EmailAddressType, EmailAddress.Email AS EmailAddress,
PhoneNumberType.Type As PhoneNumberType, PhoneNumber.Number AS PhoneNumber,
Direction.Type AS Direction, Activity.Summary, Activity.DateCompleted
FROM Contact
LEFT JOIN Address ON Contact.ContactPK = Address.ContactPK
LEFT JOIN AddressType ON Address.AddressTypePK = AddressType.AddressTypePK
LEFT JOIN EmailAddress ON Contact.ContactPK = EmailAddress.ContactPK
LEFT JOIN EmailAddressType ON EmailAddress.EmailAddressTypePK = EmailAddressType.EmailAddressTypePK
LEFT JOIN PhoneNumber ON Contact.ContactPK = PhoneNumber.ContactPK
LEFT JOIN PhoneNumberType ON PhoneNumber.PhoneNumberTypePK = PhoneNumberType.PhoneNumberTypePK
LEFT JOIN Activity ON Contact.ContactPK = Activity.ContactPK
LEFT JOIN Direction ON Activity.DirectionPK = Direction.DirectionPK
WHERE Contact.ContactId = @ContactId
AND Address.IsPrimary = 1 AND EmailAddress.IsPrimary = 1 AND PhoneNumber.IsPrimary = 1",
param:new { ContactId = contactId },
map:(c, a) =>
{
Contact contactEntry;
if (!contactDictionary.TryGetValue(c.ContactId, out contactEntry))
{
contactEntry = c;
contactEntry.Activities = new List<Activity>();
contactDictionary.Add(contactEntry.ContactId, contactEntry);
}
contactEntry.Activities.Add(a);
return contactEntry;
},
splitOn: "ContactId")
.Distinct()
.ToList();
这是 SSMS 中 运行 时 SQL 的结果:
这是我在执行代码时遇到的错误: 使用多映射 API 时,如果您有 Id 以外的键,请确保设置 splitOn 参数 参数名称:splitOn
我真的很困惑,因为我以为我指定了 splitOn 参数?
如有任何帮助,我们将不胜感激。
splitOn 参数应指示 dapper 如何将属性与两个实体(联系人和 Activity)分开,您应将其设置为 activity 的第一个 属性(假设您属性在 SQL 语句中排序)。