Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menukar Harta Kanak-Kanak Bukan Koleksi dengan Cekap kepada DTO dalam Teras EF?

Bagaimanakah Saya Boleh Menukar Harta Kanak-Kanak Bukan Koleksi dengan Cekap kepada DTO dalam Teras EF?

DDD
DDDasal
2025-01-23 20:01:11328semak imbas

How Can I Efficiently Convert Non-Collection Child Properties to DTOs in EF Core?

Memperkemas Penukaran DTO untuk Hartanah Anak Bukan Pengumpulan dalam Teras EF

Teras Rangka Kerja Entiti (Teras EF) memudahkan penukaran entiti-ke-DTO (Objek Pemindahan Data), terutamanya untuk koleksi kanak-kanak. Walau bagaimanapun, pengendalian individu, sifat kanak-kanak bukan koleksi memerlukan pendekatan yang lebih bernuansa. Membenamkan logik penukaran secara langsung dalam ungkapan, sementara berfungsi, membawa kepada pertindihan kod.

Pertimbangkan contoh ini:

<code class="language-csharp">public static Expression<Func<Model, ModelDto>> AsDto =>
    model => new ModelDto
    {
        ModelId = model.ModelId,
        ModelName = model.ModelName,
        ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(),
        AnotherChildModel = new AnotherChildModelDto
        {
            AnotherChildModelId = model.AnotherChildModel.AnotherChildModelId
        }
    };</code>

Untuk mengelakkan kod berulang, memanfaatkan perpustakaan sumber terbuka menawarkan penyelesaian yang lebih elegan. Perpustakaan ini menyuntik penyedia pertanyaan tersuai ke dalam Teras EF, membolehkan manipulasi pepohon ungkapan:

  • LINQKit: Menggunakan atribut Expandable dan AsExpandable kaedah sambungan untuk mengubah suai pepohon ungkapan.

    <code class="language-csharp">  [Expandable(nameof(AsDtoImpl))]
      public static ModelDto AsDto(Model model)
      {
          _asDtoImpl ??= AsDtoImpl().Compile();
          return _asDtoImpl(model);
      }
    
      private static Func<Model, ModelDto> _asDtoImpl;
    
      private static Expression<Func<Model, ModelDto>> AsDtoImpl =>
          model => new ModelDto
          {
              ModelId = model.ModelId,
              ModelName = model.ModelName,
              ChildModels = model.ChildModels.AsQueryable().Select(ChildModel.AsDto).ToList(),
              AnotherChildModel = ChildModelToDto(model.AnotherChildModel) //Simplified call
          };
      }
    
      private static AnotherChildModelDto ChildModelToDto(AnotherChildModel model)
      {
          return new AnotherChildModelDto { AnotherChildModelId = model.AnotherChildModelId };
      }</code>
  • NeinLinq: Tawaran [InjectLambda] dan ToInjectable() untuk menyuntik ungkapan lambda tersuai. Pelaksanaannya serupa dengan LINQKit, menggantikan atribut dan kaedah.

  • DelegateDecompiler: Menggunakan atribut [Computed] untuk terjemahan lambda-ke-delegate langsung. Sekali lagi, struktur itu mencerminkan contoh LINQKit, memudahkan panggilan kepada kaedah berasingan untuk kejelasan.

Dengan menggunakan perpustakaan ini, anda boleh memfaktorkan semula penukaran harta kanak-kanak kepada fungsi yang berasingan dan boleh digunakan semula, meningkatkan kebolehselenggaraan kod dengan ketara dan mengurangkan lebihan. Pembekal pertanyaan tersuai memastikan penilaian yang betul bagi pokok ungkapan yang diubah suai dalam konteks Teras EF.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Harta Kanak-Kanak Bukan Koleksi dengan Cekap kepada DTO dalam Teras EF?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn