vendredi 7 mai 2021

trying to add different types inside if statement

I have a below method where I am loop through the list of id's and getting the data from db based on id and then creating the material and then adding to material list

public Construction AddToOsm(Model model, APIDbContext dbContext)
{   
    var construction = new Construction(model);
    var surfaceType = dbContext.IntendedSurfaceTypes.SingleOrDefault(s => s.Id == this.SurfaceTypeId);
    construction.setName(surfaceType?.Name);
    using var materials = new MaterialVector();

    var fenestrationMaterialById = new Dictionary<Guid, FenestrationMaterial>();
    var opaqueMaterialById = new Dictionary<Guid, StandardOpaqueMaterial>();
    foreach (var materialId in this.LayerIds.Where(i => i != default))
    {
        var opaqueMaterial = dbContext.OpaqueMaterials.SingleOrDefault(o => o.Id == materialId);
        if (opaqueMaterial != default)
        {
            materials.Add(opaqueMaterialById.GetOrCreate(opaqueMaterial.Id, () => opaqueMaterial.AddToOsm(model)));
        }
        else
        {
            var glazingMaterial = dbContext.GlazingMaterials.SingleOrDefault(o => o.Id == materialId);
            if (glazingMaterial != default)
            {
                materials.Add(fenestrationMaterialById.GetOrCreate(glazingMaterial.Id, () => glazingMaterial.AddToOsm(model)));
            }
            else
            {
                var glazingSimpleMaterial = dbContext.SimpleGlazingMaterials.SingleOrDefault(s => s.Id == materialId);
                if(glazingSimpleMaterial != default)
                {
                    materials.Add(fenestrationMaterialById.GetOrCreate(glazingSimpleMaterial.Id, () => glazingSimpleMaterial.AddToOsm(model)));
                }
                else
                {
                    var gasGlazingMaterials = dbContext.GasGlazingMaterials.SingleOrDefault(a => a.Id == materialId);
                    if(gasGlazingMaterials != default)
                    {
                        materials.Add(fenestrationMaterialById.GetOrCreate(gasGlazingMaterials.Id, () => gasGlazingMaterials.AddToOsm(model)));
                    }
                }
            }
        }
    }
    construction.setLayers(materials);
    return construction;
}    

I am looking a way to avoid this much of if-else statements mainly refactoring this but could not find a way to do. Could any one please suggest any idea on how to achieve the same.

Thanks in advance.

Aucun commentaire:

Enregistrer un commentaire