【发布时间】:2014-11-03 20:59:34
【问题描述】:
我正在使用 Dapper 来获取结果列表。我有很多只包含 ID 和名称的“价值”表。
我有这个 SQL;
SELECT
MedicationScheduleItem.*,
MedicationSchedule.*,
Patient.*,
Medication.*,
MedicationBrand.*,
MedicationScheduleItemRepeat.*,
MedicationType.*,
Measure.*
FROM MedicationScheduleItem
JOIN MedicationSchedule ON (MedicationSchedule.Id = MedicationScheduleItem.MedicationScheduleId)
JOIN Patient ON (Patient.Id = MedicationSchedule.PatientId)
JOIN Medication ON (Medication.Id = MedicationScheduleItem.MedicationId)
JOIN MedicationBrand ON (MedicationBrand.Id = Medication.MedicationBrandId)
JOIN MedicationType ON (MedicationType.Id = Medication.MedicationTypeId)
JOIN Measure ON (Measure.Id = Medication.MeasureId)
LEFT JOIN MedicationScheduleItemRepeat ON (MedicationScheduleItemRepeat.MedicationScheduleItemId = MedicationScheduleItem.Id)
我正在尝试将该 SQL 映射到这样的模型;
using Dapper;
//...
private readonly IDbConnection _connection;
//...
private IEnumerable<MedicationScheduleResultModel> QueryMedicationScheduleResultModels(string sql, object parameters = null)
{
var results = new Dictionary<int, MedicationScheduleResultModel>();
_connection.Query<MedicationScheduleItem, MedicationSchedule, Patient, Medication, MedicationBrand, MedicationScheduleItemRepeat, MedicationType, Measure, MedicationScheduleResultModel>(sql,
(medicationScheduleItem, medicationSchedule, patient, medication, medicationBrand, medicationScheduleItemRepeat, medicationType, measure) =>
{
MedicationScheduleResultModel viewModel;
if (!results.TryGetValue(medicationSchedule.Id, out viewModel))
{
results.Add(medicationSchedule.Id, new MedicationScheduleResultModel
{
Id = medicationSchedule.Id,
Patient = patient,
TimeCreated = medicationSchedule.TimeCreated,
StartDate = medicationSchedule.StartDate,
Schedules = new List<MedicationScheduleItemResultModel>()
{
BuildMedicationScheduleItemResultModel(medicationScheduleItem,
medicationScheduleItemRepeat, medication, medicationBrand, medicationType, measure)
}
});
}
else
{
viewModel.Schedules.Add(BuildMedicationScheduleItemResultModel(medicationScheduleItem,
medicationScheduleItemRepeat, medication, medicationBrand));
}
return viewModel;
}, parameters, splitOn: "Id, MedicationScheduleItemId");
return results.Values;
}
private static MedicationScheduleItemResultModel BuildMedicationScheduleItemResultModel(MedicationScheduleItem medicationScheduleItem, MedicationScheduleItemRepeat medicationScheduleItemRepeat, Medication medication, MedicationBrand medicationBrand, MedicationType medicationType, Measure measure)
{
return new MedicationScheduleItemResultModel()
{
Id = medicationScheduleItem.Id,
ExecuteTime = medicationScheduleItem.ExecuteTime,
RepeatTimeSpan = medicationScheduleItemRepeat != null
? (TimeSpan?)TimeSpan.FromTicks(medicationScheduleItemRepeat.RepeatTimeSpan)
: null,
Medication = new MedicationResultModel()
{
Id = medication.Id,
Name = medication.Name,
Brand = new MedicationBrand()
{
Id = medicationBrand.Id,
Name = medicationBrand.Name
},
Measure = measure.Name,
Type = medicationType.Name,
Weight = medication.Weight
}
};
}
但是_connection.Query<T, ..> 失败了,因为有很多泛型类型。
有没有办法让它工作,还是我做错了?
【问题讨论】:
-
什么是
_connection? -
我更新了问题,是
IDbConnection -
你能把
BuildMedicationScheduleItemResultModel的代码贴出来吗?如果您在其中所做的只是构造MedicationScheduleItemResultModel并从输入对象分配属性,那么您应该修改您的SQL 查询以返回适当的列并让Dapper 直接为您创建MedicationScheduleItemResultModel。 -
@ErenErsönmez 我已经更新了问题,我所做的只是将字段映射到模型。
标签: c# sql generics mapping dapper