C# foreach循环不显示正确的结果
我的嵌套foreach循环有问题。我试图用汽车信息(公司、不同车型)将数据从by数据库填充到我的列表中。我的问题与我的内部循环有关,无法继续填充我的列表 我期待的结果是:C# foreach循环不显示正确的结果,c#,asp.net-core,methods,C#,Asp.net Core,Methods,我的嵌套foreach循环有问题。我试图用汽车信息(公司、不同车型)将数据从by数据库填充到我的列表中。我的问题与我的内部循环有关,无法继续填充我的列表 我期待的结果是: "CompanyId": 1, "CompanyName": "Toyota" "ParentVehicleId": 2, "ParentVehicleName": "Camry", "ChildVehicleId": 4, "ChildVehicleName":"Camry/Scepter" "CompanyId": 1
"CompanyId": 1,
"CompanyName": "Toyota"
"ParentVehicleId": 2,
"ParentVehicleName": "Camry",
"ChildVehicleId": 4,
"ChildVehicleName":"Camry/Scepter"
"CompanyId": 1,
"CompanyName": "Toyota"
"ParentVehicleId": 4,
"ParentVehicleName": "Crown"
"ChildVehicleId": 0,
"ChildVehicleName":"N/A"
"CompanyId": 12,
"CompanyName": "Hyundai"
"ParentVehicleId": 13,
"ParentVehicleName": "Accent",
"ChildVehicleId": 0,
"ChildVehicleName":"N/A"
etc...
但实际上我得到的只有这两个:
"CompanyId": 1,
"CompanyName": "Toyota"
"ParentVehicleId": 2,
"ParentVehicleName": "Camry",
"ChildVehicleId": 3,
"ChildVehicleName":"Camry/Vista"
"CompanyId": 1,
"CompanyName": "Toyota"
"ParentVehicleId": 2,
"ParentVehicleName": "Camry",
"ChildVehicleId": 4,
"ChildVehicleName":"Camry/Scepter"
这是my db表的一个片段:
车辆表
C#代码
public List>VehicleMethod()
{
列表车辆列表=新列表();
foreach(公司信息中的var项目)
{
var parentInfo=_context.VehicleTable.Where(y=>item.VehicleId==y.manufacturid.ToList();
foreach(parentInfo中的var item2)
{
var childInfo=_context.VehicleTable.Where(y=>item2.VehicleId==y.manufactuid.ToList();
foreach(childInfo中的变量项3)
{
VehicleListModel vehList=新的VehicleListModel();
//如果ChildVehicleId不存在,则为0&N/A
//返回
vehList.CompanyId=item.VehicleId;
vehList.CompanyName=项目?.BrandName???“不适用”;
车辆列表。添加(车辆列表);
}
}
}
返回车辆列表;
}
在每次迭代中,您都将覆盖vehList
实例。相反,您应该将其初始化移动到最内部的循环,以便在每次迭代中将一个新实例添加到列表中:
foreach (var item in companyInfo)
{
var parentInfo = _context.VehicleTable.Where(y => item.VehicleId == y.ManufactId).ToList();
foreach (var item2 in parentInfo)
{
// This should be removed from the code:
// VehicleListModel vehList = new VehicleListModel();
var childInfo = _context.VehicleTable.Where(y => item2.VehicleId == y.ManufactId).ToList();
foreach (var item3 in childInfo)
{
// Instead, it's initialized here:
VehicleListModel vehList = new VehicleListModel();
//if ChildVehicleId does not exist, 0 & N/A are
//returned
vehList.CompanyId = item.VehicleId;
vehList.CompanyName = item?.BrandName ?? "N/A";
vehList.ParentVehicleId = item2?.VehicleId ?? 0;
vehList.ParentVehicleName = item2?.BrandName ?? "N/A";
vehList.ChildVehicleId = item3?.VehicleId ?? 0;
vehList.ChildVehicleName = item3?.BrandName ?? "N/A";
vehicleList.Add(vehList);
}
}
}
在每次迭代中,您将覆盖
vehList
实例。相反,您应该将其初始化移动到最内部的循环,以便在每次迭代中将一个新实例添加到列表中:
foreach (var item in companyInfo)
{
var parentInfo = _context.VehicleTable.Where(y => item.VehicleId == y.ManufactId).ToList();
foreach (var item2 in parentInfo)
{
// This should be removed from the code:
// VehicleListModel vehList = new VehicleListModel();
var childInfo = _context.VehicleTable.Where(y => item2.VehicleId == y.ManufactId).ToList();
foreach (var item3 in childInfo)
{
// Instead, it's initialized here:
VehicleListModel vehList = new VehicleListModel();
//if ChildVehicleId does not exist, 0 & N/A are
//returned
vehList.CompanyId = item.VehicleId;
vehList.CompanyName = item?.BrandName ?? "N/A";
vehList.ParentVehicleId = item2?.VehicleId ?? 0;
vehList.ParentVehicleName = item2?.BrandName ?? "N/A";
vehList.ChildVehicleId = item3?.VehicleId ?? 0;
vehList.ChildVehicleName = item3?.BrandName ?? "N/A";
vehicleList.Add(vehList);
}
}
}
问题主要在于数据的连接方式 以丰田为例:
|----------------------------------------------|----------------|
| VehicleId | ManufactId | BrandId | BrandName |
|----------------------------------------------|----------------|
| 1 | null | 1 | Toyota |
|----------------------------------------------|----------------|
| 2 | 1 | 1 | Camry |
|----------------------------------------------|----------------|
| 3 | 2 | 1 | Camry/Vista |
|----------------------------------------------|----------------|
| 4 | 2 | 1 | Camry/Scepter |
正如你所看到的,凯美瑞车型是各个版本和公司之间的关系
当VehicleId为2(来自凯美瑞)时,您将查找ManufactId为2(Vista和Scepter)的记录
对于日产而言:
|----------------------------------------------|----------------|
| VehicleId | ManufactId | BrandId | BrandName |
|----------------------------------------------|----------------|
| 9 | null | 9 | Nissan |
|----------------------------------------------|----------------|
| 10 | 9 | 9 | Datsun |
|----------------------------------------------|----------------|
| 11 | 9 | 9 | Datsun 13T |
Datsun没有child(没有记录的ManufactId等于10)。将Datsun 13 T记录更新为ManufactId 10以查看它
其余的也一样
此外,由于您在最内部的foreach循环中添加了列表对象(而且您永远无法访问该代码),因此您甚至无法获得空对象
如果数据错误,您对此无能为力,处理这些情况的一种可能方法是使用可用信息生成对象:
....
List<VehicleListModel> vehicleList = new List<VehicleListModel>();
var companies = _context.Where(x => x.ManufactId == null).ToList();
foreach (var company in companies)
{
var models = _context.Where(y => company.VehicleId == y.ManufactId).ToList();
if (models.Any())
{
foreach (var model in models)
{
var versions = _context.Where(y => model.VehicleId == y.ManufactId).ToList();
if (versions.Any())
{
foreach (var version in versions)
{
VehicleListModel vehList = new VehicleListModel();
vehList.CompanyId = company.VehicleId;
vehList.CompanyName = company?.BrandName ?? "N/A";
vehList.ParentVehicleId = model?.VehicleId ?? 0;
vehList.ParentVehicleName = model?.BrandName ?? "N/A";
vehList.ChildVehicleId = version?.VehicleId ?? 0;
vehList.ChildVehicleName = version?.BrandName ?? "N/A";
vehicleList.Add(vehList);
}
}
else
{
VehicleListModel vehList = new VehicleListModel();
vehList.CompanyId = company.VehicleId;
vehList.CompanyName = company.BrandName;
vehList.ParentVehicleId = model.VehicleId;
vehList.ParentVehicleName = model.BrandName;
vehList.ChildVehicleId = 0;
vehList.ChildVehicleName = "N/A";
vehicleList.Add(vehList);
}
}
}
else
{
VehicleListModel vehList = new VehicleListModel();
vehList.CompanyId = company.VehicleId;
vehList.CompanyName = company.BrandName;
vehList.ParentVehicleId = 0;
vehList.ParentVehicleName = "N/A";
vehList.ChildVehicleId = 0;
vehList.ChildVehicleName = "N/A";
vehicleList.Add(vehList);
}
}
....
。。。。
列表车辆列表=新列表();
var companys=_context.Where(x=>x.ManufactId==null).ToList();
foreach(公司中的var公司)
{
var models=_context.Where(y=>company.VehicleId==y.manufacturid.ToList();
if(models.Any())
{
foreach(模型中的var模型)
{
var versions=_context.Where(y=>model.VehicleId==y.manufactuid.ToList();
if(versions.Any())
{
foreach(版本中的var版本)
{
VehicleListModel vehList=新的VehicleListModel();
vehList.CompanyId=company.VehicleId;
vehList.CompanyName=公司?.BrandName??“不适用”;
vehList.ParentVehicleId=车型?.VehicleId±0;
vehList.ParentVehicleName=型号?.BrandName??“不适用”;
vehList.ChildVehicleId=版本?.VehicleId±0;
vehList.ChildVehicleName=版本?.BrandName??“不适用”;
车辆列表。添加(车辆列表);
}
}
其他的
{
VehicleListModel vehList=新的VehicleListModel();
vehList.CompanyId=company.VehicleId;
vehList.CompanyName=company.BrandName;
vehList.ParentVehicleId=model.VehicleId;
vehList.ParentVehicleName=model.BrandName;
vehList.ChildVehicleId=0;
vehList.ChildVehicleName=“不适用”;
车辆列表。添加(车辆列表);
}
}
}
其他的
{
VehicleListModel vehList=新的VehicleListModel();
vehList.CompanyId=company.VehicleId;
vehList.CompanyName=company.BrandName;
vehList.ParentVehicleId=0;
vehList.ParentVehicleName=“不适用”;
vehList.ChildVehicleId=0;
vehList.ChildVehicleName=“不适用”;
车辆列表。添加(车辆列表);
}
}
....
此外,正如@Yair所建议的,您需要将Crown更改为manufacturid=1问题主要在于数据的连接方式 以丰田为例:
|----------------------------------------------|----------------|
| VehicleId | ManufactId | BrandId | BrandName |
|----------------------------------------------|----------------|
| 1 | null | 1 | Toyota |
|----------------------------------------------|----------------|
| 2 | 1 | 1 | Camry |
|----------------------------------------------|----------------|
| 3 | 2 | 1 | Camry/Vista |
|----------------------------------------------|----------------|
| 4 | 2 | 1 | Camry/Scepter |
正如你所看到的,凯美瑞车型是各个版本和公司之间的关系
当VehicleId为2(来自凯美瑞)时,您将查找ManufactId为2(Vista和Scepter)的记录
对于日产而言:
|----------------------------------------------|----------------|
| VehicleId | ManufactId | BrandId | BrandName |
|----------------------------------------------|----------------|
| 9 | null | 9 | Nissan |
|----------------------------------------------|----------------|
| 10 | 9 | 9 | Datsun |
|----------------------------------------------|----------------|
| 11 | 9 | 9 | Datsun 13T |
Datsun没有child(没有记录的ManufactId等于10)。将Datsun 13 T记录更新为ManufactId 10以查看它
其余的也一样
此外,由于您在最内部的foreach循环中添加了列表对象(而且您永远无法访问该代码),因此您甚至无法获得空对象
如果数据错误,您对此无能为力,处理这些情况的一种可能方法是使用可用信息生成对象:
....
List<VehicleListModel> vehicleList = new List<VehicleListModel>();
var companies = _context.Where(x => x.ManufactId == null).ToList();
foreach (var company in companies)
{
var models = _context.Where(y => company.VehicleId == y.ManufactId).ToList();
if (models.Any())
{
foreach (var model in models)
{
var versions = _context.Where(y => model.VehicleId == y.ManufactId).ToList();
if (versions.Any())
{
foreach (var version in versions)
{
VehicleListModel vehList = new VehicleListModel();
vehList.CompanyId = company.VehicleId;
vehList.CompanyName = company?.BrandName ?? "N/A";
vehList.ParentVehicleId = model?.VehicleId ?? 0;
vehList.ParentVehicleName = model?.BrandName ?? "N/A";
vehList.ChildVehicleId = version?.VehicleId ?? 0;
vehList.ChildVehicleName = version?.BrandName ?? "N/A";
vehicleList.Add(vehList);
}
}
else
{
VehicleListModel vehList = new VehicleListModel();
vehList.CompanyId = company.VehicleId;
vehList.CompanyName = company.BrandName;
vehList.ParentVehicleId = model.VehicleId;
vehList.ParentVehicleName = model.BrandName;
vehList.ChildVehicleId = 0;
vehList.ChildVehicleName = "N/A";
vehicleList.Add(vehList);
}
}
}
else
{
VehicleListModel vehList = new VehicleListModel();
vehList.CompanyId = company.VehicleId;
vehList.CompanyName = company.BrandName;
vehList.ParentVehicleId = 0;
vehList.ParentVehicleName = "N/A";
vehList.ChildVehicleId = 0;
vehList.ChildVehicleName = "N/A";
vehicleList.Add(vehList);
}
}
....
。。。。
列表车辆列表=新列表();
var companys=_context.Where(x=>x.ManufactId==null).ToList();
foreach(公司中的var公司)
{
var models=_context.Where(y=>company.VehicleId==y.manufacturid.ToList();
if(models.Any())
{
foreach(模型中的var模型)
{
var versions=_context.Where(y=>model.VehicleId==y.manufactuid.ToList();
if(versions.Any())
{
foreach(版本中的var版本