Saya mendapatkan kesalahan berikut saat mencoba melakukan kueri LINQ:
LINQ ke Entitas tidak mengenali metode metode 'Boolean IsCharityMatching (System.String, System.String)', dan metode ini tidak dapat diterjemahkan ke dalam ekspresi penyimpanan.
Saya telah membaca banyak pertanyaan sebelumnya di mana orang mendapatkan kesalahan yang sama, dan jika saya memahami ini dengan benar, itu karena LINQ ke Entitas memerlukan seluruh ekspresi kueri LINQ untuk diterjemahkan ke kueri server, dan oleh karena itu Anda tidak dapat memanggil metode luar di dalamnya. Saya belum bisa mengubah skenario saya menjadi sesuatu yang berhasil, dan otak saya mulai mencair, jadi saya berharap seseorang bisa mengarahkan saya ke arah yang benar. Kami menggunakan Entity Framework dan pola spesifikasi (dan saya baru mengenal keduanya).
Berikut kode yang menggunakan spesifikasi tersebut:
ISpecification<Charity> specification = new CharitySearchSpecification(charityTitle, charityReference);
charities = charitiesRepository.Find(specification).OrderBy(p => p.RegisteredName).ToList();
Berikut ekspresi linq:
public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
return p => p.IsCharityMatching(this.charityName, this.charityReference);
}
Berikut metode IsCharityMatching:
public bool IsCharityMatching(string name, string referenceNumber)
{
bool exists = true;
if (!String.IsNullOrEmpty(name))
{
if (!this.registeredName.ToLower().Contains(name.ToLower()) &&
!this.alias.ToLower().Contains(name.ToLower()) &&
!this.charityId.ToLower().Contains(name.ToLower()))
{
exists = false;
}
}
if (!String.IsNullOrEmpty(referenceNumber))
{
if (!this.charityReference.ToLower().Contains(referenceNumber.ToLower()))
{
exists = false;
}
}
return exists;
}
Beri tahu saya jika Anda memerlukan informasi lebih lanjut.
Terimakasih banyak,
Annelie
Find()
saat bagaimana Anda menggunakanIsSatisfied()
di dalamnya.Jawaban:
Seperti yang Anda ketahui, Entity Framework tidak dapat menjalankan kode C # Anda sebagai bagian dari kuerinya. Itu harus dapat mengubah kueri menjadi pernyataan SQL yang sebenarnya. Agar itu berfungsi, Anda harus menyusun ulang ekspresi kueri Anda menjadi ekspresi yang dapat ditangani oleh Entity Framework.
sumber
Expression<Func<T,type>>
adalah pendekatan yang sangat bagus untuk ini.context.Where(IsSatisfied())
Saya mendapat kesalahan yang sama dalam kode ini:
inilah tepatnya kesalahan:
Saya menyelesaikannya dengan cara ini:
Saya menambahkan .ToList () sebelum tabel saya, ini memisahkan kode Entity dan linq, dan menghindari ekspresi linq saya berikutnya diterjemahkan
CATATAN: solusi ini tidak optimal, karena hindari pemfilteran entitas, dan cukup muat semua tabel ke dalam memori
sumber
Jika ada yang mencari jawaban VB.Net (seperti saya awalnya), ini dia:
sumber
Saya memiliki masalah yang serupa dengan Anda dan dokumentasi LINQ ini membantu saya menemukan fungsi string yang tepat untuk mengatasi batasan tersebut.
sumber