我编写了一个程序,该程序使用外部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();
}
}