Saya memiliki metode di bawah ini di mana saya mengulang daftar id dan mendapatkan data dari db berdasarkan id dan kemudian membuat materi dan kemudian menambahkan ke daftar materi

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;
}    

Saya mencari cara untuk menghindari banyak pernyataan if-else ini terutama dengan refactoring ini tetapi tidak dapat menemukan cara untuk melakukannya. Adakah yang bisa menyarankan ide tentang cara mencapai hal yang sama.

Terima kasih sebelumnya.

Pembaruan: contoh struktur entitas

public class GasGlazingMaterial : ISourceOfData, IIdentity<Guid>
{
    [Key]
    public Guid Id { get; set; }
    public string Name { get; set; }
    [ForeignKey("SourceOfData")]
    public Guid? SourceOfDataId { get; set; }
    public virtual CodeStandardGuideline SourceOfData { get; set; }
    ......
    .....
 }
-1
Enigma State 7 Mei 2021, 01:56

1 menjawab

Jawaban Terbaik

Perbaikan sederhana adalah dengan "melanjutkan" setelah setiap material.add. Ini berarti Anda tidak perlu menyematkan sisanya di yang lain

0
bwakabats 6 Mei 2021, 23:05