Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menukar Harta Kanak-Kanak Bukan Koleksi dengan Cekap kepada DTO dalam Teras EF?
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!