Pada artikel ini, penulis memperkenalkan kueri bersama Linq secara rinci, karena saya khawatir pembaca tidak memahami aspek ini dengan baik, jadi sebelum berbicara tentang kueri bersama Linq, pertama-tama saya akan memberikan beberapa pengetahuan untuk Anda, dan kemudian berbicara tentang bagaimana kueri bersama Linq diterapkan, berharap dapat membantu Anda.
Pertama, mari kita pahami beberapa poin pengetahuan dari kueri bersama Linq.
1. Jenis pengiriman anonim
static void Main(string[] args) { var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); Console.Write(User.UserName); } objek statis GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; Pengguna kembali;
} Ketika kita mendefinisikan jenis anonim, itu hanya dapat dilewatkan melalui jenis objek, dan kompiler tidak akan mengetahui jenis sebenarnya dari jenis anonim setelah lulus.
Baris ini dapat ditransmisikan melalui metode ekstensi Cast. Di bawah ini adalah prototipe metode Cast.
T Cast statis publik (objek ini o, T t) { kembali ();
} 2. Bagaimana cara membuat daftar jenis anonim untuk kueri federasi Linq?
var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = new List< ?>(); Prinsipnya sama dengan di atas.
var Pengguna = baru { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); daftar. Tambahkan(Pengguna); Console.Write(list[0]. Nama Pengguna); Mari kita lihat metode MakeList():
publik statis Daftar MakeList(T t ini) { mengembalikan List();
} Tentu saja, Anda mungkin berpikir bahwa metode di atas tidak cukup sempurna, dan Anda perlu menambahkan Pengguna ke Daftar, jadi Anda memiliki metode berikut:
publik statis Daftar MakeList (ini T t, parameter T [] item) { mengembalikan List(items) baru; } Saat dipanggil, itu dapat ditulis sebagai:
var Pengguna = baru { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(Pengguna); Console.Write(list[0]. Nama Pengguna); Kali ini, mari kita mulai mengejar dan memahami bagaimana kueri federasi Linq diimplementasikan.
var q = dari p dalam db. Produk di mana p.Supplier.Country == "USA" && p.UnitsInStock == 0 pilih p; Kueri di atas adalah dua tabel terkait, dan hanya konten satu tabel yang dikembalikan, dalam hal ini, Daftar yang diketik dengan kuat dapat dikembalikan di lapisan data. Sebagai contoh:
Daftar publik SelectProducts() { var q = dari p dalam db. Produk di mana p.Supplier.Country == "USA" && p.UnitsInStock == 0 pilih p; mengembalikan q.ToList;
} Jika kumpulan hasil yang ditampilkan lebih dari dua tabel, bagaimana seharusnya diteruskan? Anda pasti berpikir bahwa jika kumpulan hasil yang dikembalikan adalah satu baris data, kita dapat menggunakan jenis pengiriman anonim yang kita sebutkan sebelumnya untuk mendapatkan hasil yang kita butuhkan. objek publik
objek publik SelectProducts() { var q = dari p dalam db. Produk di mana p.Supplier.Country == "USA" && p.UnitsInStock == 0 pilih {p.UnitsInStock,p.Supplier.Sid} baru; var result = q.Single(); mengembalikan hasil;
} Namun, premis ini adalah bahwa lapisan logika bisnis perlu mengetahui jenis anonimitas tertentu di lapisan data. Pelapisan ini tidak terlalu penting. Ini bukan yang kita inginkan. Selain itu, metode menggunakan jenis Daftar anonim untuk mengembalikan kumpulan hasil data multi-baris juga gagal setelah eksperimen. Ini berarti bahwa tidak satu pun dari dua metode untuk melewati anonimitas di awal artikel ini akan berhasil.
Metode 1: Kueri federasi Linq menyesuaikan kelas dengan struktur yang sama dengan jenis pengembalian
kelas publik CustomQuery { publik uint UnitInStock { mendapatkan; menetapkan; } publik int Sid { mendapatkan; menetapkan; }
} Ini dapat diselesaikan ketika hasil kueri adalah kumpulan hasil dari beberapa tabel. Karena Anda perlu mengetahui jenis anonimitas yang dikembalikan, Anda perlu menentukan kelas tambahan selain tidak sesuai dengan multilayer. Tetapi ini benar dan dapat mengembalikan hasil yang kita butuhkan menggunakan tipe yang kuat.
Metode 2: Kueri federasi Linq menggunakan delegasi System.Func (Referensi: Mengembalikan var dari metode di C# 3.0)
Lapisan Data:
publik IEnumerable GetCustomersWithOrders(Func, Proyeksi > proyeksi) { pengembalian dari pelanggan di _customers let customerOrders = dari pesanan di _orders di mana pesanan. ID Pelanggan = customer.ID pilih proyeksi (pelanggan, pelangganPesanan);
} Lapisan logika bisnis:
hasil var = GetCustomersWithOrders( (pelanggan, pesanan) => baru { Nama = pelanggan. Nama OrderCount = pesanan. Hitung () }); Hasil yang dikembalikan dengan cara ini masih merupakan jenis anonim sejati di lapisan logika bisnis dan dapat digunakan secara langsung.
Metode 3: Kueri federasi Linq menggunakan prosedur atau tampilan tersimpan. |