sambungan luar linq -outer
Bagaimana untuk melaksanakan satu konkrit penuh antara kedua -dua objek berdasarkan bidang kunci awam untuk memastikan semua rekod kedua -dua senarai dimasukkan ke dalam hasilnya.
Jawapan:
1. Kaedah sambungan tersuai yang disambungkan ke seluruh luar
Untuk mencapai sambungan luar di Linq, kita boleh menentukan kaedah pengembangan tersuai, seperti yang ditunjukkan di bawah:2. Melaksanakan
Dalam contoh yang disediakan, kami mempunyai dua senarai:public static IEnumerable<TResult> FullOuterJoin<TA, TB, TKey, TResult>( this IEnumerable<TA> a, IEnumerable<TB> b, Func<TA, TKey> selectKeyA, Func<TB, TKey> selectKeyB, Func<TA, TB, TKey, TResult> projection, TA defaultA = default(TA), TB defaultB = default(TB), IEqualityComparer<TKey> cmp = null) { cmp = cmp ?? EqualityComparer<TKey>.Default; var alookup = a.ToLookup(selectKeyA, cmp); var blookup = b.ToLookup(selectKeyB, cmp); var keys = new HashSet<TKey>(alookup.Select(p => p.Key), cmp); keys.UnionWith(blookup.Select(p => p.Key)); var join = from key in keys from xa in alookup[key].DefaultIfEmpty(defaultA) from xb in blookup[key].DefaultIfEmpty(defaultB) select projection(xa, xb, key); return join; }
firstNames
3. Penjelasan <3>
lastNames
Kod ini menggunakan sambungan luar kiri, dan setiap rekod dalam
var outerJoin = from first in firstNames join last in lastNames on first.ID equals last.ID into temp from last in temp.DefaultIfEmpty() select new { id = first != null ? first.ID : last.ID, firstname = first != null ? first.Name : string.Empty, surname = last != null ? last.Name : string.Empty };
untuk memastikan ia mengandungi rekod yang tidak memuaskan. Ini sebenarnya menyedari sambungan luaran kiri, bukan koneksi penuh dalam erti kata yang lengkap. Untuk mencapai sambungan luar, anda perlu menggunakan kaedah pengembangan firstNames
yang disesuaikan di atas. lastNames
into temp
4. Mengharapkan output lastNames
DefaultIfEmpty()
output yang diharapkan dari sambungan luar ialah: FullOuterJoin
Kaedah lanjutan menyediakan membolehkan anda menentukan nilai lalai untuk rekod yang tidak memuaskan. Contohnya, kami menentukan
untuk nama yang tidak memuaskan, dan kami menentukan integer negatif untuk ID yang tidak menonjol.<code>ID FirstName LastName -- --------- -------- 1 John Doe 2 Sue 3 Smith</code>
Masa berjalan keseluruhan sambungan luar adalah O (n m), di mana n dan m adalah panjang dua senarai input. Ini kerana operasi string.Empty
memerlukan masa O (n), dan operasi seterusnya memerlukan masa O (n m).
Pelaksanaan keseluruhan sambungan luar kini bukan sebahagian daripada standard Linq, tetapi disyorkan untuk memasukkannya dalam versi masa depan. LINQ standard tidak secara langsung menyokong sambungan luar dan perlu disesuaikan untuk mencapainya. ToLookup()
Atas ialah kandungan terperinci Bagaimana untuk melakukan gabungan luar penuh di Linq?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!