This commit is contained in:
2024-07-11 19:52:47 +07:00
parent e3c69229ad
commit 56484b54c8
4 changed files with 62 additions and 19 deletions

View File

@ -41,25 +41,40 @@ namespace Yuna.Website.Server.Storage.Repositories.Device
throw new NotImplementedException();
}
public async Task<Model.Device> GetById(long id)
public async Task<Model.Device?> GetById(long id)
{
var query =
$@"SELECT
d.""Id"" as {nameof(Model.Device.Id)},
d.""Name"" as {nameof(Model.Device.Name)},
d.""Description"" as {nameof(Model.Device.Description)},
p.""Id"" as {nameof(Model.Prop.Id)},
p.""Name"" as {nameof(Model.Prop.Name)},
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)},
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)}
FROM ""Yuna_Devices"" d
LEFT JOIN ""Yuna_Props_In_Devices"" pd ON d.""Id"" = pd.""DeviceId""
LEFT JOIN ""Yuna_Props"" p ON pd.""PropId"" = p.""Id""
WHERE d.""Id"" = {id}
LIMIT 1";
d.""Id"" as {nameof(Model.Device.Id)},
d.""Name"" as {nameof(Model.Device.Name)},
d.""Description"" as {nameof(Model.Device.Description)},
p.""Id"" as {nameof(Model.Prop.Id)},
p.""Name"" as {nameof(Model.Prop.Name)},
p.""JsonValueName"" as {nameof(Model.Prop.JsonValueName)},
p.""MeasureName"" as {nameof(Model.Prop.MeasureName)}
FROM ""Yuna_Devices"" d
LEFT JOIN ""Yuna_Props_In_Devices"" pd ON d.""Id"" = pd.""DeviceId""
LEFT JOIN ""Yuna_Props"" p ON pd.""PropId"" = p.""Id""
WHERE d.""Id"" = {id}";
var result = await _context.Connection.QuerySingleAsync<Model.Device>(query);
return result;
var deviceDict = new Dictionary<long, Model.Device>();
var result = await _context.Connection.QueryAsync<Model.Device, Model.Prop, Model.Device>(
query,
(device, prop) =>
{
if (!deviceDict.TryGetValue(device.Id, out var currentDevice))
{
currentDevice = device;
currentDevice.Props = new List<Model.Prop>();
deviceDict.Add(currentDevice.Id, currentDevice);
}
currentDevice.Props.Add(prop);
return currentDevice;
},
splitOn: $"{nameof(Model.Prop.Id)}" // Specify the column to split the results on
);
return result.FirstOrDefault();
}
public async Task<IReadOnlyList<Model.Device>> GetList()
@ -77,8 +92,24 @@ namespace Yuna.Website.Server.Storage.Repositories.Device
LEFT JOIN ""Yuna_Props_In_Devices"" pd ON d.""Id"" = pd.""DeviceId""
LEFT JOIN ""Yuna_Props"" p ON pd.""PropId"" = p.""Id""";
var result = await _context.Connection.QueryAsync<Model.Device>(query);
return result.ToList();
var deviceDict = new Dictionary<long, Model.Device>();
var result = await _context.Connection.QueryAsync<Model.Device, Model.Prop, Model.Device>(
query,
(device, prop) =>
{
if (!deviceDict.TryGetValue(device.Id, out var currentDevice))
{
currentDevice = device;
currentDevice.Props = new List<Model.Prop>();
deviceDict.Add(currentDevice.Id, currentDevice);
}
currentDevice.Props.Add(prop);
return currentDevice;
},
splitOn: $"{nameof(Model.Prop.Id)}" // Specify the column to split the results on
);
return result.Distinct().ToList();
}
}
}

View File

@ -4,7 +4,7 @@ namespace Yuna.Website.Server.Storage.Repositories.Device
{
public interface IDeviceRepository
{
public Task<Model.Device> GetById(long id);
public Task<Model.Device?> GetById(long id);
public Task<IReadOnlyList<Model.Device>> GetList();
public Task<Model.Device?> Create(Model.Device device);
//public Task<User?> Update(User user);