আচরণ
ধরুন আপনার দুটি তালিকা রয়েছে:
Id Value
1 A
2 B
3 C
Id ChildValue
1 a1
1 a2
1 a3
2 b1
2 b2
আপনি যখন ক্ষেত্রের Joinদুটি তালিকাতে Idফলাফল পাবেন:
Value ChildValue
A a1
A a2
A a3
B b1
B b2
আপনি যখন ক্ষেত্রের GroupJoinদুটি তালিকাতে Idফলাফল পাবেন:
Value ChildValues
A [a1, a2, a3]
B [b1, b2]
C []
সুতরাং Joinপিতা-মাতার এবং সন্তানের মানগুলির সমতল (সারণী) ফলাফল উত্পন্ন করে।
GroupJoinপ্রথম তালিকায় এন্ট্রিগুলির একটি তালিকা তৈরি করে, প্রত্যেকটি দ্বিতীয় তালিকায় যোগ দেওয়া এন্ট্রিগুলির একটি গ্রুপ সহ।
এজন্য এসকিউএল Joinএর সমতুল্য INNER JOIN: এর জন্য কোনও এন্ট্রি নেই C। যদিও GroupJoinএর সমতূল্য OUTER JOIN: Cফলাফল সেট হয়, কিন্তু (সেট একটি SQL ফলাফলে একটি সারিতে সেখানে হবে একটি খালি সংশ্লিষ্ট এন্ট্রির তালিকা সঙ্গে C - null)।
বাক্য গঠন
তাই দুই তালিকা হতে দিন IEnumerable<Parent>এবং IEnumerable<Child>যথাক্রমে। (লিনক টু সত্তার ক্ষেত্রে IQueryable<T>:)।
Join বাক্য গঠন হবে
from p in Parent
join c in Child on p.Id equals c.Id
select new { p.Value, c.ChildValue }
IEnumerable<X>এক্স দুটি নাম সহ একটি বেনামী ধরণের যেখানে ফিরে আসা , Valueএবং ChildValue। এই কোয়েরি সিনট্যাক্সটি Joinহুডের নীচে পদ্ধতিটি ব্যবহার করে ।
GroupJoin বাক্য গঠন হবে
from p in Parent
join c in Child on p.Id equals c.Id into g
select new { Parent = p, Children = g }
একটি ফেরার IEnumerable<Y>যেখানে ওয়াই একটি বেনামী ধরনের এক সম্পত্তি গঠিত প্রকার Parentলিখুন একটি সম্পত্তি IEnumerable<Child>। এই কোয়েরি সিনট্যাক্সটি GroupJoinহুডের নীচে পদ্ধতিটি ব্যবহার করে ।
আমরা কেবল select gউত্তরোত্তর ক্যোয়ারিতে করতে পারি , যা একটি নির্বাচন করবে IEnumerable<IEnumerable<Child>>, তালিকার একটি তালিকা বলবে। অনেক ক্ষেত্রে অন্তর্ভুক্ত পিতামাতার সাথে নির্বাচন করা আরও কার্যকর।
কিছু ব্যবহার ক্ষেত্রে
1. একটি সমতল বাইরের জোড় উত্পাদন।
যেমনটি বলা হয়েছে, বিবৃতি ...
from p in Parent
join c in Child on p.Id equals c.Id into g
select new { Parent = p, Children = g }
... শিশু দলের সাথে পিতামাতার একটি তালিকা তৈরি করে। এটি দুটি ছোট সংযোজন দ্বারা পিতা-সন্তানের জুগুলির একটি সমতল তালিকায় পরিণত হতে পারে:
from p in parents
join c in children on p.Id equals c.Id into g // <= into
from c in g.DefaultIfEmpty() // <= flattens the groups
select new { Parent = p.Value, Child = c?.ChildValue }
ফলাফলটিও সেরকমই
Value Child
A a1
A a2
A a3
B b1
B b2
C (null)
নোট করুন যে উপরের বিবৃতিতে পরিসীমা পরিবর্তনশীলটিকে c পুনরায় ব্যবহার করা হয়েছে। এটি করার ফলে, বিদ্যমান বিবৃতিটির সমতুল্য যোগ করে যে কোনও joinবিবৃতি কেবলমাত্র একটিতে রূপান্তর করা যায় ।outer joininto g from c in g.DefaultIfEmpty()join
এখানে কোয়েরি (বা বিস্তৃত) সিনট্যাক্স জ্বলজ্বল করে। পদ্ধতি (বা সাবলীল) সিনট্যাক্সটি আসলে কী ঘটে তা দেখায় তবে এটি লেখা শক্ত:
parents.GroupJoin(children, p => p.Id, c => c.Id, (p, c) => new { p, c })
.SelectMany(x => x.c.DefaultIfEmpty(), (x,c) => new { x.p.Value, c?.ChildValue } )
সুতরাং একটি ফ্ল্যাট outer joinLINQ একটি হল GroupJoin, দ্বারা চ্যাপ্টা SelectMany।
2. অর্ডার সংরক্ষণ করা
ধরা যাক পিতামাতার তালিকাটি কিছুটা দীর্ঘ। কিছু ইউআই Idনির্দিষ্ট ক্রমে মান হিসাবে নির্বাচিত পিতামাতার একটি তালিকা তৈরি করে । আসুন ব্যবহার করুন:
var ids = new[] { 3,7,2,4 };
এখন নির্বাচিত পিতামাতাকে অবশ্যই এই সঠিক ক্রমে অভিভাবকদের তালিকা থেকে ফিল্টার করতে হবে।
আমরা যদি ...
var result = parents.Where(p => ids.Contains(p.Id));
... এর ক্রম parentsফলাফল নির্ধারণ করবে। যদি পিতামাতাদের দ্বারা আদেশ করা হয় Idতবে ফলাফলটি পিতামাতার 2, 3, 4, 7. হবে good তবে, আমরা joinতালিকাটি ফিল্টার করতেও ব্যবহার করতে পারি । এবং idsপ্রথম তালিকা হিসাবে ব্যবহার করে , আদেশ সংরক্ষণ করা হবে:
from id in ids
join p in parents on id equals p.Id
select p
ফলাফল 3, 7, 2, 4 পিতামাতার।