Oke, saya akan melakukannya. Saya berencana untuk memasang iklan, tetapi kemudian saya berpikir, jika saya memposting postingan iklan murni, saya yakin akan banyak kutukan dan batu bata dan telur beterbangan di mana-mana masukkan DAC dengan baik. Mengenai LINQ khusus Izinkan saya menjelaskan kode yang mendukung ekspresi. Mungkin ini akan membantu beberapa orang yang menulis lapisan datanya sendiri atau ingin menulis beberapa ekstensi LINQ praktis berfungsi sebagai "saran", bukankah itu bagus!
Di versi DAC sebelumnya, ekspresi berikut digunakan untuk melakukan kueri:
IEnumerable<Issue> q = this.dc.Query<Issue>(Issue._.IssueID >= 0);
"_" yang "imut" ini terkesan begitu "kekanak-kanakan", apalagi di era LINQ yang merajalela ini, terkesan sangat "maju mengikuti perkembangan zaman". Jadi ada versi v2.6 yang mendukung ekstensi DAC LINQ.
var q = ini.dc.Query<Masalah>(s => s.IssueID > 0);
atau
var q = dari s di (ini.dc.GetQueryableData<Masalah>())
di mana s.IssueID > 0
pilih;
Implementasi kedua metode di atas terutama bergantung pada penguraian ekspresi dan penyusunan pernyataan SQL. Postingan Lao Zhao ditulis dengan sangat baik, dan Anda juga dapat melihat kode sumber DAC (saya menyisipkan iklan).
Hal utama yang ingin saya katakan hari ini adalah, jika kita awalnya memiliki pohon ekspresi sendiri dan fungsi penguraiannya, dapatkah kita dengan mudah "meningkatkannya" untuk mendukung LINQ? ! Ya, itu mudah!
var q = dari s di SystemUser._
dimana s.Nama Lengkap == s.Nama Lengkap.Max
dipesan berdasarkan s.UserID
pilih s.Kecuali(s.Kata Sandi);
Untuk mengijinkan suatu objek menjadi "where", "orderby", "select", maka biarkan objek tersebut mengimplementasikan metode bernama "Where", "OrderBy", "Select", atau gunakan metode Metode Ekstensi, seperti di DAC:
kelas statis publik QueryExpressionExtension
{
publik statis RaisingStudio.Data.Expressions.IQueryExpression<T> Dimana<T>(
sumber RaisingStudio.Data.Expressions.IQueryExpression<T> ini,
Ekspresi<Func<T, RaisingStudio.Data.Expressions.ConditionExpression>> predikat)
{
kembali (RaisingStudio.Data.Expressions.QueryExpression baru<T>(
sumber.Nilai,
sumber.Tabel,
(predikat.Kompilasi())(sumber.Nilai),
sumber.Kolom));
}
publik statis RaisingStudio.Data.Expressions.IQueryExpression<T> OrderBy<T>(
sumber RaisingStudio.Data.Expressions.IQueryExpression<T> ini,
Ekspresi<Func<T, RaisingStudio.Data.Expressions.ColumnExpression>> predikat)
{… }
publik statis RaisingStudio.Data.Expressions.IQueryExpression<T> Pilih<T>(
sumber RaisingStudio.Data.Expressions.IQueryExpression<T> ini,
Ekspresi<Func<T, objek>> predikat)
{ ... }
}
Dalam implementasi metode ini, panggil metode Kompilasi pada ekspresi "sistem" yang masuk untuk mengembalikan ekspresi "kustom", dan kemudian simpan ekspresi "kustom" ini di "QueryExpression" )", ketika "kueri" dijalankan, ekspresi "kustom" yang disimpan dapat langsung dikeluarkan. Dengan cara ini, kueri dapat diimplementasikan dengan menggunakan penguraian asli dari ekspresi "kustom" dalam kode di atas! ! !