Saya mendapatkan pengecualian ini:
Anggota jenis tertentu 'Berbayar' tidak didukung di LINQ ke Entitas. Hanya penginisialisasi, anggota entitas, dan properti navigasi entitas yang didukung.
public ActionResult Index()
{
var debts = storeDB.Orders
.Where(o => o.Paid == false)
.OrderByDescending(o => o.DateCreated);
return View(debts);
}
Kelas Model saya
public partial class Order
{
public bool Paid {
get {
return TotalPaid >= Total;
}
}
public decimal TotalPaid {
get {
return Payments.Sum(p => p.Amount);
}
}
Pembayaran adalah tabel terkait yang berisi jumlah bidang, Kueri berfungsi jika saya menghapus klausa Di mana yang menampilkan informasi yang benar tentang pembayaran, ada petunjuk apa yang salah dengan kode tersebut?
Dipecahkan seperti jawaban yang disarankan dengan:
public ActionResult Index()
{
var debts = storeDB.Orders
.OrderByDescending(o => o.DateCreated)
.ToList()
.Where(o => o.Paid == false);
return View(debts);
}
linq
entity-framework
Marc
sumber
sumber
Jawaban:
Entitas mencoba mengonversi properti Berbayar Anda ke SQL dan tidak bisa karena itu bukan bagian dari skema tabel.
Yang dapat Anda lakukan adalah membiarkan Entitas melakukan kueri tabel tanpa filter Berbayar, lalu memfilter yang tidak Berbayar.
Itu, tentu saja, berarti Anda membawa semua data kembali ke server web dan memfilter data di dalamnya. Jika Anda ingin memfilter pada server DB, Anda dapat membuat Kolom Terhitung pada tabel atau menggunakan Prosedur Tersimpan.
sumber
Hanya harus menyelesaikan masalah serupa. Solusi di atas membutuhkan pemrosesan dalam memori, yang merupakan praktik yang buruk (pemuatan lambat).
Solusi saya adalah menulis pembantu yang mengembalikan predikat:
Anda dapat menulis ulang pernyataan linq Anda sebagai:
Ini berguna saat Anda ingin menggunakan kembali logika kalkulasi (KERING). Kelemahannya adalah logikanya tidak ada dalam model domain Anda.
sumber
Expression<Func<xx,yy>>
. Saya pernah memahaminya sebelumnya, tetapi sepertinya sudah jelas sekarang.Masalah ini juga dapat berasal dari
[NotMapped]
properti yang memiliki nama yang sama di Model DB dan Model Tampilan Anda.AutoMapper mencoba untuk memilihnya dari DB selama proyeksi; dan properti NotMapped jelas tidak ada di DB.
Solusinya adalah untuk
Ignore
properti di konfigurasi AutoMapper saat memetakan dari Model DB ke Model Tampilan.[NotMapped]
properti dengan namaFoo
di Model DB Anda.Foo
,, di Model Tampilan Anda..ForMember(a => a.Foo, b => b.Ignore());
sumber
Sekarang, konversi ini hanya terjadi untuk anggota entitas, penginisialisasi, dan properti navigasi entitas. Jadi untuk mencapai fungsi atau mendapatkan perbandingan properti, pertama-tama kita perlu mengubahnya menjadi listing dalam memori dan kemudian menerapkan fungsi untuk mengambil data.
Oleh karena itu secara totalitas,
sumber
Kemungkinan alasan lainnya adalah karena Anda menggunakan
IEnumerable
untuk properti Anda, bukanICollection
Jadi, alih-alih:
Melakukan hal ini:
Dan kau keren ... bodoh kehilangan 2 jam lebih.
sumber
Situasi ini juga dapat terjadi jika Anda menggunakan jenis EntityFramework yang tidak didukung , seperti unsigned int.
Ini adalah kasus kesalahan saya.
Lihat informasi lebih lanjut tentang jenis yang didukung: https://msdn.microsoft.com/en-us/library/ee382832(v=vs.100).aspx
Ada beberapa solusi untuk situasi seperti itu, dijelaskan oleh GFoley83: Bagaimana cara menggunakan tipe unsigned int / long dengan Entity Framework?
sumber
Saya menghadapi masalah ini karena memiliki variabel anggota dengan hanya
get
without set
propertiitu artinya itu
auto calculated
dannot stored
sebagai kolom dithe table
oleh karena itu
not exist
ditable schema
sumber
edmx dan model konteks Anda memiliki beberapa properti berbeda yang baru ditambahkan ke db.
Perbarui EDMX Anda, segarkan dengan benar Bulid proyek Anda dan jalankan lagi.
Ini akan menyelesaikan masalah Anda.
Salam, Ganesh Nikam
sumber