Saya sedang melakukan tutorial praktek mvcmusicstore. Saya perhatikan sesuatu saat membuat perancah untuk pengelola album (tambahkan hapus edit).
Saya ingin menulis kode dengan elegan, jadi saya mencari cara yang bersih untuk menulis ini.
FYI saya membuat toko ini lebih umum:
Album = Item
Genre = Kategori
Artis = Merek
Inilah cara indeks diambil (dihasilkan oleh MVC):
var items = db.Items.Include(i => i.Category).Include(i => i.Brand);
Berikut cara pengambilan item untuk dihapus:
Item item = db.Items.Find(id);
Yang pertama membawa kembali semua barang dan mengisi kategori dan model merek di dalam model barang. Yang kedua, tidak mengisi kategori dan merek.
Bagaimana saya bisa menulis yang kedua untuk menemukan DAN mengisi apa yang ada di dalamnya (sebaiknya dalam 1 baris) ... secara teoritis - sesuatu seperti:
Item item = db.Items.Find(id).Include(i => i.Category).Include(i => i.Brand);
c#
asp.net-mvc
entity-framework
Ralph N
sumber
sumber
Jawaban:
Anda harus menggunakan
Include()
dulu, lalu mengambil satu objek dari kueri yang dihasilkan:sumber
Jawaban Dennis menggunakan
Include
danSingleOrDefault
. Yang terakhir berjalan-jalan ke database.Alternatif, adalah menggunakan
Find
, dalam kombinasi denganLoad
, untuk pemuatan eksplisit entitas terkait ...Di bawah ini contoh MSDN :
Tentu saja,
Find
segera kembali tanpa membuat permintaan ke toko, jika entitas itu sudah dimuat oleh konteks.sumber
Find
sehingga jika entitas ada, tidak ada perjalanan pulang pergi ke DB untuk entitas itu sendiri. NAMUN, Anda akan memiliki perjalanan bolak-Load
balik untuk setiap hubungan yang sedang Anda jalani , sedangkanSingleOrDefault
kombinasi denganInclude
memuat semuanya sekaligus.Load
fungsi, relasi harus diisi ketika panggilan kembali. Jadi, jika Anda meneleponLoad
beberapa kali untuk beberapa hubungan, akan ada perjalanan pulang pergi setiap kali. Bahkan untuk relasi tunggal, jikaFind
metode ini tidak menemukan entitas dalam memori, ia membuat dua perjalanan bolak-Find
balik : satu untuk dan yang kedua untukLoad
. Tapi ituInclude
.SingleOrDefault
Pendekatan mengambil entitas dan hubungan dalam satu jalan sejauh yang saya tahu (tapi saya tidak yakin)Anda harus menggunakan IQueryable ke DbSet
var dbSet = (DbSet<Item>) db.Set<Item>().Include("");
return dbSet.Find(id);
sumber
Tidak bekerja untuk saya. Tapi saya menyelesaikannya dengan melakukan seperti ini.
Jangan tahu kalau itu solusi yang ok. Tapi yang lain memberi Dennis memberi saya kesalahan bool dalam
.SingleOrDefault(x => x.ItemId = id);
sumber
SingleOrDefault(x => x.ItemId = id)
hanya karena single yang salah,=
bukan double==
?Tidak ada cara nyata yang mudah untuk menyaring dengan menemukan. Tetapi saya telah menemukan cara yang dekat untuk mereplikasi fungsi ini, tetapi harap perhatikan beberapa hal untuk solusi saya.
Solusi ini memungkinkan Anda untuk memfilter secara umum tanpa mengetahui kunci utama dalam .net-core
Temukan secara mendasar berbeda karena ia memperoleh entitas jika ada dalam pelacakan sebelum Meminta basis data.
Selain itu dapat memfilter berdasarkan Obyek sehingga pengguna tidak harus tahu kunci utama.
Solusi ini untuk EntityFramework Core.
Berikut adalah beberapa metode ekstensi untuk ditambahkan yang akan membantu Anda memfilter dengan kunci primer
Setelah Anda memiliki metode ekstensi ini, Anda dapat memfilter seperti:
sumber