আচরণ
ধরুন আপনার দুটি তালিকা রয়েছে:
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 join
into 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 join
LINQ একটি হল 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 পিতামাতার।