কীভাবে একক যোগদানের ক্ষেত্রে একাধিক ক্ষেত্রগুলিতে LINQ এ যোগদান করবে


244

আমার একটি লিনিকিউ 2 ডেটাসেট কোয়েরি করা দরকার যা একাধিক ক্ষেত্রের (যেমন হিসাবে) যোগ দেয়

var result = from x in entity
join y in entity2 
       on x.field1 = y.field1 
and 
          x.field2 = y.field2

আমি এখনও একটি উপযুক্ত সমাধান খুঁজে পেয়েছি (আমি যেখানে ক্লজটিতে অতিরিক্ত বাধা যুক্ত করতে পারি, তবে এটি উপযুক্ত সমাধান থেকে অনেক দূরে, বা এই সমাধানটি ব্যবহার করে , তবে এটি একটি ইকুইজয়াইন অনুমান করে)।

লিনকিউতে কি একক যোগে একাধিক ক্ষেত্রের সাথে যোগ দেওয়া সম্ভব?

সম্পাদনা

var result = from x in entity
             join y in entity2
             on new { x.field1, x.field2 } equals new { y.field1, y.field2 }

সমাধানটি যা আমি উপরে একটি ইকুইজয়েন ধরে ধরেছি।

আরও সম্পাদনা

আমার আসল উদাহরণটি ইকুইজয়াইন ছিল এমন সমালোচনার জবাব দেওয়ার জন্য, আমি স্বীকার করি যে, আমার বর্তমান প্রয়োজনীয়তা একটি সমমূল্যের জন্য এবং আমি ইতিমধ্যে উপরে উল্লিখিত সমাধানটি নিযুক্ত করেছি।

আমি যাইহোক, লিনকিউ-তে আমার কী কী সম্ভাবনা এবং সর্বোত্তম অনুশীলনগুলি নিযুক্ত করা উচিত / তা বোঝার চেষ্টা করছি। আমি খুব শীঘ্রই একটি টেবিল আইডির সাথে একটি তারিখের সীমা ক্যোয়ারীটি করাতে যাচ্ছি, এবং এই সমস্যাটি কেবল প্রাক-শূন্য করে দিচ্ছিলাম, দেখে মনে হচ্ছে যে যেখানে আমি ধারাটিতে তারিখের সীমাটি যুক্ত করব।

ধন্যবাদ, সর্বদা হিসাবে, সমস্ত পরামর্শ এবং মতামত দেওয়া জন্য


48
এটি পড়ার জন্য কেবল একটি এফওয়াইআই, আপনি যদি অ্যানোন ক্লাসে একটি বহু ক্ষেত্র যোগদান করেন তবে আপনাকে উভয় অ্যানোন ক্লাসের ক্ষেত্রগুলির নাম একই হওয়া উচিত, অন্যথায় আপনি সংকলন ত্রুটিগুলি পেয়েছেন।
চিহ্নিত করুন

6
বা বরং, আপনার অবশ্যই তাদের অবশ্যই মিল রয়েছে নামগুলি নিশ্চিত করতে হবে। অর্থ্যাৎ আপনি কেবল আনোন ধরণের একের ক্ষেত্রের নাম রেখে অন্যটির সাথে মিল রাখতে পারেন।
টম ফার্গুসন

1
এই উত্তরের দিকে মনোযোগ দিন stackoverflow.com/a/34176502/1704458
টিএস

আমি বস্তুর চেয়ে সমান উভয় পক্ষের জন্য tuples ব্যবহার করেছি এবং এটি খুব কার্যকর বলে মনে হচ্ছে।
জিএইচজেড

উত্তর:


89

বেনামে টাইপ সহ সমাধানটি ভাল কাজ করা উচিত। LINQ করতে শুধুমাত্র equijoins প্রতিনিধিত্ব (ক্লজ যোগ দিতে, যাহাই হউক না কেন সঙ্গে), এবং কি আপনি করেছি আপনি আপনার মূল ক্যোয়ারী উপর ভিত্তি করে যাহাই হউক না কেন প্রকাশ করতে চান বলেন প্রকৃতপক্ষে যে।

আপনি যদি কোনও নির্দিষ্ট কারণে বেনামে ধরণের সংস্করণটি পছন্দ না করেন তবে আপনার সেই কারণটি ব্যাখ্যা করা উচিত।

আপনি কি আপনার মূলত চাইলেন ছাড়া অন্য কিছু করতে চান, আপনি কি একটি উদাহরণ দিন সত্যিই কাজ করতে চান।

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

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


ধন্যবাদ, হ্যাঁ পারফরমেন্স হ'ল ক্লজটি ব্যবহার করে আমার প্রধান উদ্বেগ। আমি অনুমান করছি যেখানে যোগদানের পরের ধারাটি বৃহত্তর ডেটাসেটে এমন একটি ফিল্টার সম্পাদন করবে যা দ্বিতীয় জোনের প্যারামিটারটি প্রবর্তন করে হ্রাস করা যেতে পারে। আমি যদি দক্ষতা অর্জন করতে পারি তবে পরীক্ষার অর্ডার দেওয়ার ধারণাটি পছন্দ করি
jhnc

আপনার কতটি রেকর্ড থাকবে? ভুলে যাবেন না যে ফলাফলগুলি দিয়ে শুরু করার ক্রমটি শুরু করতে নির্দিষ্ট সময় লাগবে ...
জন স্কিটি

"এগুলি শব্দার্থগতভাবে সত্যই সমতুল্য" - সেখানে কি আমাদের 'সত্যই' শব্দটির দরকার আছে? সম্ভবত আপনি বোঝাতে চেয়েছিলেন, "এগুলি সত্যই
অর্থার্থগত

136
var result = from x in entity
   join y in entity2 on new { x.field1, x.field2 } equals new { y.field1, y.field2 }

10110 লিনক নমুনার কাছে এটি ছিল না বা আমি দেখেছি এটি কমপক্ষে এটি দেখার জন্য আমি সন্ধান করছিলাম।
ক্রিস মেরিসিক

1
: @PeterX প্রকৃতপক্ষে এটা, আমার উত্তর এখানে দেখতে পারেন stackoverflow.com/a/22176658/595157
niieani

13
উপরের কোডটি কার্যকর হয়নি। যোগ করার পরে on new { X1= x.field1, X2= x.field2 } equals new { X1=y.field1, X2= y.field2 } এটি কাজ করেছে
রবি রাম

@ রবি রাম .. ধন্যবাদ .. আপনার মন্তব্য সাহায্য করেছে
এনমাথুর

80
var result = from x in entity1
             join y in entity2
             on new { X1= x.field1, X2= x.field2 } equals new { X1=y.field1, X2= y.field2 }

কলামের নাম দুটি সত্তায় আলাদা থাকলে আপনার এটি করতে হবে।


6
বিভিন্ন কলামের নাম উল্লেখ করার জন্য ধন্যবাদ। এটি আমার খারাপ অভিব্যক্তি স্থির করেছে।
গাʀʀʏ

1
এটি আমার জন্যও কাজ করেছিল। যদি কলামের নামগুলি মেলে না, আপনি এই ত্রুটিটি পেয়ে যাবেন, "যোগদানের ধারাটিতে যে কোনও একটির মত প্রকাশের ধরণটি ভুল '
হাম্বাদ

মূল ভেরিয়েবলগুলি aliasing করার জন্য আপনাকে ধন্যবাদ।
থমাস.বেঞ্জ

আমি যখন ত্রুটি পেয়েছি @ হাম্বাদরা যখন উল্লেখ করেছি যখন আমি 'নতুন {}' এর সমস্ত বৈশিষ্ট্যের নাম রাখি না। সুতরাং শুধু fyi আপনি যদি একটি নাম রাখেন তবে আপনাকে অবশ্যই বাকীটির নাম লিখতে হবে।
ইথান মেলামেড

আপনাকে অনেক ধন্যবাদ
চার্লি এইচ

51

একটি সমতুল্য পদ্ধতি চেইন সিনট্যাক্স দিয়ে এটি সম্পূর্ণ করতে:

entity.Join(entity2, x => new {x.Field1, x.Field2},
                     y => new {y.Field1, y.Field2}, (x, y) => x);

যদিও সর্বশেষ যুক্তিটি (x, y) => xআপনি যা নির্বাচন করেছেন তা হচ্ছে (উপরের ক্ষেত্রে আমরা নির্বাচন করি x)।


31

আমি মনে করি যেখানে আরও ফাংশনযোগ্য এবং নমনীয় বিকল্পটি হ'ল ফাংশনটি ব্যবহার করা:

var result = from x in entity1
             from y in entity2
                 .Where(y => y.field1 == x.field1 && y.field2 == x.field2)

এটি সহজেই অভ্যন্তরীণ জোড় থেকে বাম জোড়ায় জোড় করে সহজে পরিবর্তন করতে দেয়। DefaultIfEmpty ()।


দীর্ঘদিন ধরে লাম্বদা ব্যবহারকারী হিসাবে এখন (যখন আমি প্রশ্ন জিজ্ঞাসা করেছি তার বিপরীতে), আমাকে সম্মত হতে হবে
johnc

এটি কি ধীর হবে?
আলফ্রেডবিআর

1
আমি মনে করি এটির নতুন { ... } equals new { ... }সিনট্যাক্সের মতোই পারফরম্যান্স হওয়া উচিত । এক্সপ্রেশনগুলি কীভাবে আচরণ করছে তা দেখার জন্য লিনকপ্যাড একটি দুর্দান্ত সরঞ্জাম (লিনিক 2 এসকিউএল ব্যবহৃত হয় তবে এসকিউএল স্ক্রিপ্ট, এক্সপ্রেশন ট্রি ইত্যাদি)
আলেক্সি

যতদূর আমি লক্ষ্য করেছি যে এটি INNER JOIN
Mariusz এর

@ মারিউস হ্যাঁ, এটি অন্তর্ভুক্ত হওয়ার পরিবর্তে ক্রস যোগ যোগ করুন যেখানে যেখানে জেনারেশনে তৈরি হওয়া অর্থপূর্ণ। সাধারণ প্রশ্নের জন্য আমি আশা করি বিশ্লেষকটি যদিও খুব অনুরূপ উত্পন্ন করবে।
আলেক্সি

10
var result = from x in entity
             join y in entity2
             on new { X1= x.field1, X2= x.field2 } equals new { X1=y.field1, X2= y.field2 }
             select new 
             {
               /// Columns
              };

8

আপনি যেমন কিছু করতে পারেন (নীচে)

var query = from p in context.T1

        join q in context.T2

        on

        new { p.Col1, p.Col2 }

        equals

         new { q.Col1, q.Col2 }

        select new {p...., q......};

আমি প্রশ্ন উল্লেখ করা হয়েছে, যাতে একটি equijoin প্রয়োজন
johnc

7

যোগদানের অপারেটরটি ব্যবহার করে আপনি কেবল ইক্যুইজনগুলি সম্পাদন করতে পারেন। অন্যান্য অপারেটরগুলি ব্যবহার করে অন্যান্য ধরণের যোগদান যোগ করা যায়। আমি নিশ্চিত নই যে আপনি যে সঠিক যোগদানের চেষ্টা করছেন তা এই পদ্ধতিগুলি ব্যবহার করে বা যেখানে ধারাটি পরিবর্তন করে আরও সহজ হবে। যোগদানের দফায় ডকুমেন্টেশন এখানে পাওয়া যাবে । এমএসডিএন এর সাথে অন্যান্য যোগদানের উদাহরণের একাধিক লিঙ্ক সহ অপারেশনগুলিতে যোগদানের নিবন্ধ রয়েছে ।


3

ক্ষেত্রের নাম সত্ত্বায় পৃথক হলে

var result = from x in entity
   join y in entity2 on 
          new {
                field1=   x.field1,
               field2 =  x.field2 
             } 
          equals
         new { 
                field1= y.field1,
                field2=  y.myfield
              }
select new {x,y});

ধন্যবাদ. নামটির মিল ছিল সেই টুকরোটি যা আমি মিস করছি।
ব্রেট

2

একটি সম্পূর্ণ পদ্ধতি শৃঙ্খলা হিসাবে এটি দেখতে হবে:

lista.SelectMany(a => listb.Where(xi => b.Id == a.Id && b.Total != a.Total),
                (a, b) => new ResultItem
                {
                    Id = a.Id,
                    ATotal = a.Total,
                    BTotal = b.Total
                }).ToList();

-2
from d in db.CourseDispatches
                             join du in db.DispatchUsers on d.id equals du.dispatch_id
                             join u in db.Users on du.user_id equals u.id
                             join fr in db.Forumreports on (d.course_id + '_' + du.user_id)  equals  (fr.course_id + '_'+ fr.uid)

এটা আমার জন্য কাজ করে


এটি একাধিক যোগদানের জন্য, তিনি একক
যোগে

-3

আপনি যে উপাদানগুলিতে যোগ দিতে চান তা ধরে রাখতে একটি শ্রেণি (প্রকার) ঘোষণা করুন। নীচের উদাহরণে জয়েনমেন্ট ঘোষণা করুন

 public class **JoinElement**
{
    public int? Id { get; set; }
    public string Name { get; set; }

}

results = from course in courseQueryable.AsQueryable()
                  join agency in agencyQueryable.AsQueryable()
                   on new **JoinElement**() { Id = course.CourseAgencyId, Name = course.CourseDeveloper } 
                   equals new **JoinElement**() { Id = agency.CourseAgencyId, Name = "D" } into temp1

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