Tukar pertanyaan SQL yang mengandungi berbilang gabungan, kiraan dan gabungan kiri kepada LINQ
Pertanyaan SQL anda menggunakan berbilang cantuman, cantuman kiri dan fungsi agregat untuk mendapatkan semula data daripada berbilang jadual. Untuk menukar pertanyaan ini kepada LINQ, ikut langkah ini:
Pertanyaan SQL asal:
<code class="language-sql">SELECT DISTINCT c.Id, c.Title, COUNT(v.Id) AS 'Nb_V2', COUNT(DISTINCT v.IdUser) AS 'Nb_V1', r.cnt AS 'Nb_R' FROM TABLE_C c JOIN TABLE_V v on c.Id = v.Id LEFT JOIN ( SELECT Id, COUNT(*) AS cnt FROM TABLE_R GROUP BY Id ) r ON c.Id = r.Id WHERE c.IdUser = '1234' GROUP BY c.Id, c.Title, r.cnt</code>
Penukaran ungkapan pertanyaan LINQ (versi dipertingkatkan):
<code class="language-csharp">var qResult = (from c in dbContext.TABLE_C join v in dbContext.TABLE_V on c.Id equals v.Id from r in dbContext.TABLE_R.Where(r => r.Id == c.Id).DefaultIfEmpty() where c.IdUser == "1234" group new { c, v, r } by new { c.Id, c.Title } into grouped select new { IdC = grouped.Key.Id, Title = grouped.Key.Title, Nb_V2 = grouped.Count(g => g.v.Id != null), Nb_V1 = grouped.Select(g => g.v.IdUser).Distinct().Count(), Nb_R = grouped.Sum(g => (int?)g.r.cnt ?? 0) // 处理r.cnt可能为null的情况 }).Distinct();</code>
Penukaran ungkapan Lambda:
<code class="language-csharp">var ansq = dbContext.TABLE_C .Where(c => c.IdUser == "1234") .Join(dbContext.TABLE_V, c => c.Id, v => v.Id, (c, v) => new { c, v }) .GroupJoin(dbContext.TABLE_R, cv => cv.c.Id, r => r.Id, (cv, r) => new { cv, r }) .SelectMany(x => x.r.DefaultIfEmpty(), (x, r) => new { x.cv.c, x.cv.v, r }) .GroupBy(x => new { x.c.Id, x.c.Title, cnt = (int?)x.r?.cnt }) .Select(g => new { g.Key.Title, Nb_V2 = g.Count(x => x.v.Id != null), Nb_V1 = g.Select(x => x.v.IdUser).Distinct().Count(), Nb_R = g.Key.cnt }) .Distinct(); </code>
Pertanyaan LINQ yang dipertingkatkan ini mengendalikan fungsi COUNT dan LEFT JOIN dengan lebih ringkas dan cekap, serta mengelakkan beberapa masalah yang berpotensi dalam kod asal, seperti pertimbangan pelik t.Id > 0
dan kemungkinan r.cnt
adalah batal. Ia lebih tepat mencerminkan logik pertanyaan SQL asal. Ambil perhatian bahawa anda perlu melaraskan dbContext.TABLE_C
, dbContext.TABLE_V
dan dbContext.TABLE_R
mengikut konteks pangkalan data dan nama entiti anda.
Atas ialah kandungan terperinci Bagaimana untuk menterjemahkan pertanyaan SQL yang kompleks dengan pelbagai gabungan, tuduhan, dan kiri bergabung ke Linq?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!