如何将数据从API保存到数据库



我编写了一个程序,该程序使用外部API,工作非常好。我浏览了SO和其他资源,但无法解决我的问题。我对c#很陌生。我创建了模型GetEquipment,其中存储从API返回的数据,EquipmentDb是一个SQL表,我想在其中插入数据。我试着这样保存:

消耗API:

public async Task<IEnumerable<GetEquipment>> GetDataFromAPI()
{
try
{
var token = await _accountService.GetToken(
_configuration["CredentialsXY:client_id"],
_configuration["CredentialsXY:client_secret"]);
var equipment = await _callAPIService.GetData(token);
return equipment;
}
catch (Exception e)
{
Debug.Write(e);
return Enumerable.Empty<GetEquipment>();
}
}

模型-SQL表:

public partial class EquipmentDb
{
public string SerialNo { get; set; }
public double? Latitude { get; set; }
public double? Longitude { get; set; }
}

模型-从API返回的数据:

public class GetEquipment
{
public Item[] items { get; set; }
}
public class Item
{
public string serial_number { get; set; }
public Location location { get; set; }
}
public class Location
{
public float longitude { get; set; }
public float latitude { get; set; }
}

将数据保存到数据库:

public async Task Index()
{
var result = await GetDataFromAPI();  // result from API
using (var ctx = new HUDAContext())
{
var equipment = new EquipmentDb(); // SQL table
foreach(var item in result)
{
equipment.SerialNo = item.items.serial_number,  // here I iterate through 'result' where I store data from API but it does not work, 'items' is highlighted
equipment.Latitude = item.items.location.latitude,
equipment.Latitude = item.items.location.longitude
};
ctx.EquipmentDbs.Add(equipment);
await ctx.SaveChangesAsync();
}                                            
}   

插入数据不起作用,我试图将result中的数据分配给SQL表中的每个字段,但不起作用。

从这个问题中还不清楚数据是如何形成的。需要理解的重要一点是您有两个集合包装器:API结果中的IEnumerable,其中包括Item[]。您必须查看这两个集合的内部。

然而,我怀疑你只会对其中一个或另一个结果抱有期望(同样:不清楚这个问题的结果是什么(。考虑到这一点,你可能想要这两个:

public async Task Index()
{
var result = await GetEquipment();  // result from API
var transformed = result.Select(e =>
new EquipmentDB {
SerialNo = e.items[0].serial_number,  // here I iterate through 'result' where I store data from API but it does not work, 'items' is highlighted
Latitude = e.items[0].location.latitude,
Latitude = e.items[0].location.longitude
}
);
using var ctx = new HUDAContext();
foreach(var item in transformed)
{
ctx.EquipmentDbs.Add(item);
await ctx.SaveChangesAsync();
}                                            
}

或者这个:

public async Task Index()
{
var result = await GetEquipment();  // result from API
var transformed = result.First().Select(e =>
new EquipmentDB {
SerialNo = e.serial_number,  // here I iterate through 'result' where I store data from API but it does not work, 'items' is highlighted
Latitude = e.location.latitude,
Latitude = e.location.longitude
}
);
using var ctx = new HUDAContext();
foreach(var item in transformed)
{
ctx.EquipmentDbs.Add(item);
await ctx.SaveChangesAsync();
}                                            
}

同样,您可能真的需要同时执行(请参阅SelectMany()(,并访问枚举表中的每个元素,对于这些元素中的每个,访问数组中的每个项。

假设您使用的是EF,并且EquipmentDB是您的上下文类,则您希望在foreach中创建一个新的Equipment数据库对象,例如:

foreach(var item in result)
{
ctx.EquipmentDbs.Add(new EquipmentDb
{
SerialNo = item.items.serial_number, 
Latitude = item.items.location.latitude,
Latitude = item.items.location.longitude
});
};

否则,您只需覆盖同一个对象,并且只保存最后一个结果。

然后在使用新填充的列表完成循环后调用save:(!

-还假设您指的是GetDataFromAPI而不是GetEquipment((

尝试先将其保存到列表中,然后在上下文上调用AddRange

public async Task Index(){
var result = await GetEquipment();  // result from API
using (HUDAContext ctx = new HUDAContext())
{

List<EquipmentDb> equipmentlist = new List<EquipmentDb>()
foreach(var item in result)
{
equipmentlist.add(new EquipmentDb{
SerialNo = item.items.serial_number, 
Latitude = item.items.location.latitude, 
Longitude = item.items.location.longitude
})
};
ctx.EquipmentDbs.AddRange(equipmentlist);
await ctx.SaveChangesAsync();
}                                            
} 

最新更新