লিঙ্ক টু সত্তা বনাম গ্রুপজয়নে যোগ দেয়


181

আমি ওয়েব অনুসন্ধান করেছি কিন্তু আমি এখনও সহজ উত্তর খুঁজে পাচ্ছি না। কেউ দয়া করে ব্যাখ্যা করতে পারেন (সহজ ইংরেজী ভাষায়) আসলে GroupJoinকী? এটি নিয়মিত অভ্যন্তর থেকে কীভাবে আলাদা Join? এটি কি সাধারণত ব্যবহৃত হয়? এটি কি কেবল পদ্ধতি সিনট্যাক্সের জন্য? কোয়েরি সিনট্যাক্স সম্পর্কে কী? একটি সি # কোড উদাহরণটি দুর্দান্ত হবে।


এমএসডিএন এর মতে, একটি গ্রুপ যোগদান একটি অভিব্যক্তি হিসাবে একটি যোগ দফা join যোগদানের ক্লজে আরও তথ্য এবং কোডের নমুনা রয়েছে। এটি মূলত একটি অভ্যন্তরীণ যোগদান (যদি ডানদিকে কোনও উপাদান বামের সাথে কোনওরূপে মেলে না, তবে আপনি একটি নাল ফল পাবেন); তবে ফলাফলটি দলবদ্ধভাবে সংগঠিত হয়।
টিম

উত্তর:


371

আচরণ

ধরুন আপনার দুটি তালিকা রয়েছে:

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 পিতামাতার।


সুতরাং একটি গ্রুপজয়িনে, শিশু মানগুলিতে অবজেক্টগুলি থাকবে, এতে সম্পর্কিত মানগুলি থাকবে?
duyn9uyen

যেমন আপনি বলেছিলেন যে গ্রুপজউইন একটি বাহ্যিক যোগদানের মতো তবে সেই বাক্য গঠন (গ্রুপ গ্রুপের জন্য নিখুঁত লিনক) বলে যে এটি বাহ্যিক যোগদানের মতো নয় তবে বাম বাহিরের জোড়ার মতো।
ইমাদ

2
আমি মনে করি যে আমি উল্লেখ করব যে "ফ্ল্যাট আউটার জয়েন" একটি বাম বহিরাগত যোগদান।
নেটমেজ

1
নিখুঁতভাবে ব্যাখ্যা করা হয়েছে, আমি এখন বুঝতে পেরেছি

19

এডলিংক অনুসারে :

গ্রুপজউইন যা করে তা নিয়ে গ্রিপস পাওয়ার সর্বোত্তম উপায় হ'ল যোগদানের কথা ভাবা। সেখানে সামগ্রিক ধারণাটি ছিল যে আমরা "বহিরাগত" ইনপুট ক্রমটি দেখেছি, "অভ্যন্তরীণ" সিকোয়েন্স থেকে সমস্ত মিলের আইটেমগুলি খুঁজে পেয়েছি (প্রতিটি অনুক্রমের উপর একটি মূল প্রজেকশন ভিত্তিক) এবং তারপরে মিলছে উপাদানগুলির জোড়া yield গ্রুপজউইন অনুরূপ, জোড়া উপাদানগুলি উত্পাদন করার পরিবর্তে, প্রতিটি আইটেমের উপর ভিত্তি করে "বাহ্যিক" আইটেম এবং "অভ্যন্তরীণ" আইটেমগুলির সাথে মিলের ক্রমের ভিত্তিতে এটি একক ফলাফল দেয়

একমাত্র পার্থক্য হ'ল ফিরতি বিবৃতিতে:

যোগদান :

var lookup = inner.ToLookup(innerKeySelector, comparer); 
foreach (var outerElement in outer) 
{ 
    var key = outerKeySelector(outerElement); 
    foreach (var innerElement in lookup[key]) 
    { 
        yield return resultSelector(outerElement, innerElement); 
    } 
} 

গ্রুপ যোগদান :

var lookup = inner.ToLookup(innerKeySelector, comparer); 
foreach (var outerElement in outer) 
{ 
    var key = outerKeySelector(outerElement); 
    yield return resultSelector(outerElement, lookup[key]); 
} 

এখানে আরও পড়ুন:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.