Metode tidak dapat diterjemahkan ke dalam ekspresi toko

89

Saya melihat kode ini berfungsi dengan LINQ ke SQL tetapi ketika saya menggunakan Entity Framework, kesalahan ini muncul:

LINQ ke Entitas tidak mengenali metode metode 'System.Linq.IQueryable'1 [MyProject.Models.CommunityFeatures] GetCommunityFeatures ()', dan metode ini tidak dapat diterjemahkan ke dalam ekspresi penyimpanan.`

Kode repositori adalah ini:

public IQueryable<Models.Estate> GetEstates()
{
    return from e in entity.Estates
           let AllCommFeat = GetCommunityFeatures()
           let AllHomeFeat = GetHomeFeatures()
           select new Models.Estate
                      {
                                EstateId = e.EstateId,
                                AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
                                AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
                      };
}

public IQueryable<Models.CommunityFeatures> GetCommunityFeatures()
{
    return from f in entity.CommunityFeatures
           select new CommunityFeatures
                      {
                          Name = f.CommunityFeature1,
                          CommunityFeatureId = f.CommunityFeatureId
                      };
}

public IQueryable<Models.HomeFeatures> GetHomeFeatures()
{
    return from f in entity.HomeFeatures
           select new HomeFeatures()
           {
               Name = f.HomeFeature1,
               HomeFeatureId = f.HomeFeatureId
           };
}

LazyList adalah Daftar yang memperluas kekuatan IQuerable.

Bisakah seseorang menjelaskan mengapa kesalahan ini terjadi?

Shawn Mclean
sumber

Jawaban:

115

Alasan: Secara desain, LINQ ke Entitas memerlukan seluruh ekspresi kueri LINQ untuk diterjemahkan ke kueri server. Hanya beberapa subekspresi yang tidak berkorelasi (ekspresi dalam kueri yang tidak bergantung pada hasil dari server) dievaluasi pada klien sebelum kueri diterjemahkan. Pemanggilan metode arbitrer yang tidak memiliki terjemahan yang diketahui, seperti GetHomeFeatures () dalam kasus ini, tidak didukung.
Untuk lebih spesifik, LINQ ke Entitas hanya mendukung konstruktor dan Penginisialisasi Parameterless .

Solusi: Oleh karena itu, untuk mengatasi pengecualian ini Anda perlu menggabungkan sub kueri Anda menjadi yang utama untuk GetCommunityFeatures () dan GetHomeFeatures ()alih-alih memanggil metode secara langsung dari dalam kueri LINQ. Juga, ada masalah pada baris yang Anda coba untuk membuat instance baru dari LazyList menggunakan konstruktor berparameternya , seperti yang mungkin Anda lakukan di LINQ ke SQL . Untuk itu solusinya adalah beralih ke evaluasi klien dari kueri LINQ (LINQ ke Objek). Ini akan meminta Anda untuk memanggil metode AsEnumerable untuk LINQ Anda ke kueri Entitas sebelum memanggil konstruktor LazyList.

Sesuatu seperti ini seharusnya bekerja:

public IQueryable<Models.Estate> GetEstates()
{
    return from e in entity.Estates.AsEnumerable()
       let AllCommFeat = from f in entity.CommunityFeatures
                         select new CommunityFeatures {
                             Name = f.CommunityFeature1,
                             CommunityFeatureId = f.CommunityFeatureId
                         },
       let AllHomeFeat = from f in entity.HomeFeatures
                         select new HomeFeatures() {
                             Name = f.HomeFeature1,
                             HomeFeatureId = f.HomeFeatureId
                         },
       select new Models.Estate {
            EstateId = e.EstateId,
            AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
            AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
       };
}


Info Lebih Lanjut: Silakan lihat di LINQ ke Entitas, apa yang tidak didukung? untuk info lebih lanjut. Lihat juga LINQ ke Entitas, Solusi tentang apa yang tidak didukung untuk diskusi mendetail tentang solusi yang mungkin. (Kedua tautan adalah versi yang di-cache karena situs web aslinya tidak aktif)

Morteza Manavi
sumber