C# foreach循环不显示正确的结果

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

我的嵌套foreach循环有问题。我试图用汽车信息(公司、不同车型)将数据从by数据库填充到我的列表中。我的问题与我的内部循环有关,无法继续填充我的列表

我期待的结果是:


"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版本