Apabila menggunakan teras Rangka Kerja Entiti, secara langsung membina objek entiti dalam unjuran linq ke pertanyaan entiti sering membawa kepada ralat: "entiti atau jenis kompleks tidak dapat dibina dalam linq ke pertanyaan entiti."
Isu:
Pertimbangkan contoh ini:
Melaksanakan ini dengan
public IQueryable<Product> GetProducts(int categoryID) { return from p in db.Products where p.CategoryID == categoryID select new Product { Name = p.Name }; }
productRepository.GetProducts(1).ToList();
Masalahnya berpunca dari fakta bahawa teras kerangka entiti menerjemahkan pertanyaan LINQ ke dalam arahan pangkalan data. Pelayan pangkalan data tidak mempunyai pengetahuan kelas
aplikasi anda dan pembina. Oleh itu, ia tidak dapat membuat contoh kelas ini.
Product
Penyelesaiannya adalah untuk memproyeksikan hasil pertanyaan anda ke dalam jenis tanpa nama atau objek pemindahan data khusus (DTOS).
Kaedah 1: Menggunakan jenis tanpa nama
Ini adalah penyelesaian yang cepat dan mudah untuk pertanyaan yang lebih kecil:
var products = (from p in db.Products where p.CategoryID == categoryID select new { Name = p.Name }).ToList();
Untuk senario yang lebih kompleks atau apabila anda memerlukan objek yang sangat ditaip, buat DTO:
Dengan memproyeksikan kepada jenis tanpa nama atau DTO, anda mengelakkan keperluan pangkalan data untuk meniru kelas entiti anda, memastikan pelaksanaan pertanyaan yang berjaya.
public class ProductDTO { public string Name { get; set; } // Add other properties as needed } public List<ProductDTO> GetProducts(int categoryID) { return (from p in db.Products where p.CategoryID == categoryID select new ProductDTO { Name = p.Name }).ToList(); }
Atas ialah kandungan terperinci Mengapa membina entiti di Linq ke unjuran entiti membuang kesilapan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!