цикл foreach не отображает правильные результаты - PullRequest
0 голосов
/ 11 мая 2019

У меня проблемы с моим вложенным циклом foreach. Я пытаюсь заполнить данные из базы данных в моем списке информацией об автомобиле (компания, различные модели автомобилей). Моя проблема связана с моим внутренним циклом и невозможностью продолжить заполнение моего списка.

Результаты, которые я ожидаю, таковы:


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

Это фрагмент моей таблицы БД:

Стол для автомобиля

|----------------------------------------------|
| VehicleId    |  ManufactId  | BrandName      |
|----------------------------------------------|
|  1           |    1         | Toyota         |
|----------------------------------------------|
|  2           |    1         | Camry          |
|----------------------------------------------|
|  3           |    2         | Camry/Vista    |
|----------------------------------------------|
|  4           |    2         | Camry/Scepter  |
|----------------------------------------------|
|  5           |    4         | Crown          |
|----------------------------------------------|
|  6           |    5         | Supra          |
|----------------------------------------------|

C # код

 public List<VehicleListModel>> VehicleMethod()
        {

            List<VehicleListModel> vehicleList = new List<VehicleListModel>();

            foreach (var item in companyInfo)
            {
                var parentInfo = _context.VehicleTable.Where(y => item.VehicleId == y.ManufactId).ToList();
                foreach (var item2 in parentInfo)
                {
                    var childInfo = _context.VehicleTable.Where(y => item2.VehicleId == y.ManufactId).ToList();

                    foreach (var item3 in childInfo)
                    {
                    VehicleListModel vehList = new VehicleListModel();

                        //if ChildVehicleId does not exist, 0 & N/A are 
                        //returned
                        vehList.CompanyId = item.VehicleId;
                        vehList.CompanyName = item?.BrandName ?? "N/A";

                        vehicleList.Add(vehList);

                    }
                }
            }
            return vehicleList;
        }


Ответы [ 2 ]

2 голосов
/ 12 мая 2019

Проблема в основном в том, как ваши данные связаны.

Давайте возьмем Тойоту:

|----------------------------------------------|----------------|
| VehicleId    |  ManufactId  |    BrandId     | BrandName      |
|----------------------------------------------|----------------|
|  1           |    null      |      1         | Toyota         |
|----------------------------------------------|----------------|
|  2           |    1         |      1         | Camry          |
|----------------------------------------------|----------------|
|  3           |    2         |      1         | Camry/Vista    |
|----------------------------------------------|----------------|
|  4           |    2         |      1         | Camry/Scepter  |

Как видите, модель Camry - это связь между версиями и компанией.

Когда VehicleId равен 2 (от Camry), вы ищете записи, где ManufactId равен 2 (Vista и Scepter).

Для Nissan вместо:

|----------------------------------------------|----------------|
| VehicleId    |  ManufactId  |    BrandId     | BrandName      |
|----------------------------------------------|----------------|
|  9           |    null      |      9         | Nissan         |
|----------------------------------------------|----------------|
|  10          |    9         |      9         | Datsun         |
|----------------------------------------------|----------------|
|  11          |    9         |      9         | Datsun 13T     |

Datsun не делает 'не иметь потомков (ни одна запись не имеет 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);
    }
}

....

Кроме того, как подсказал @Yair, вам нужно изменить Crown на ManufactId = 1

0 голосов
/ 11 мая 2019

Вы переопределяете экземпляр 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);

                }
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...