লিনকিউ অন ক্লজে একাধিক শর্তের সাথে যোগ দিন


94

আমি লিনকুতে এমন একটি ক্যোয়ারী বাস্তবায়নের চেষ্টা করছি যা ওএন ক্লজে একাধিক শর্তের সাথে একটি বাম বাহ্যিক জোড় ব্যবহার করে।

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

আমি এর জন্য কোনও ফিল্টার ব্যবহার করতে পারি না Completed == trueকারণ এটি এমন কোনও প্রকল্পগুলিকে ফিল্টার করে দেবে যার কাজগুলি সম্পন্ন হয়নি। পরিবর্তে আমি Completed == trueযোগদানের অন ধারাটিতে যুক্ত করতে চাই যাতে প্রকল্পগুলির সম্পূর্ণ তালিকা প্রদর্শিত হবে তবে কেবলমাত্র সম্পন্ন কাজগুলিই প্রদর্শিত হবে। কোন সমাপ্ত কাজ সম্পন্ন প্রকল্পগুলি টাস্কের নাল মান সহ একটি একক সারি দেখায়।

এখানে কোয়েরির ভিত্তি।

from t1 in Projects
join t2 in Tasks
on new { t1.ProjectID} equals new { t2.ProjectID } into j1
from j2 in j1.DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }

আমি কীভাবে && t2.Completed == trueএই ধারাটিতে যুক্ত করব?

এটি কীভাবে করা যায় সে সম্পর্কে আমি কোনও লিনকিউ ডকুমেন্টেশন খুঁজে পাচ্ছি না।


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

উত্তর:


132

আপনার কেবল বেনামে সম্পত্তি উভয় পক্ষের একই নাম দেওয়া দরকার

on new { t1.ProjectID, SecondProperty = true } equals 
   new { t2.ProjectID, SecondProperty = t2.Completed } into j1

@ এসভিকের মন্তব্যের ভিত্তিতে, এখানে আরও একটি বাস্তবায়ন দেওয়া হয়েছে যা আরও বোধ করতে পারে:

from t1 in Projects
from t2 in Tasks.Where(x => t1.ProjectID == x.ProjectID && x.Completed == true)
                .DefaultIfEmpty()
select new { t1.ProjectName, t2.TaskName }

4
এটি এটি করার একটি অ স্পষ্ট উপায় মত মনে হয়। আমি নিশ্চিত না যে আমি এটি বুঝতে পারি কী তা বুঝতে পারি।
সোভিক

4
@ এসভিক - বেনামে ধরণের ব্যবহার আপনাকে একাধিক মানদণ্ডে যোগদানের অনুমতি দেয়। আপনাকে কেবল নিশ্চিত করতে হবে যে সম্পত্তিটির নাম দুটি ধরণের সাথে মিলছে। কনফিউশনটি কোথা থেকে আসছে তা নিশ্চিত নই?
অ্যাডুচ্চি

বিভ্রান্তিটি হ'ল এটি সত্যিকার অর্থে আরও দু'টি andসমতা হিসাবে যুক্ত হয়েছে, কিছু "অদ্ভুত" বস্তুর একটির সমতা নয়। এবং আমার বক্তব্য প্রমাণ করার জন্য, আপনার কোডটি ভুল। এটি কাজ করার জন্য, আপনার trueবাম দিকে এবং t2.Completeডানদিকে থাকতে হবে।
সুইভিক

4
ধন্যবাদ আদুচ্চি প্রসঙ্গটি সঠিকভাবে পাওয়ার জন্য আমাকে ক্যোয়ারিতে পক্ষের অদলবদল করতে হয়েছিল, তবে এটি কার্যকর হয়েছে। এই সমস্যাটিকে সরলীকৃত করা হয়েছে, এবং আমার বাস্তব জগতে সমস্যাটি কেবল সেকেন্ডপ্রপার্টি সত্য বা মিথ্যা নয়, সেকেন্ডপ্রপার্টি একটি পূর্ণসংখ্যা এবং আমি ব্যবহার করি AND SecondProperty IN (123, 456)। আমি সেই চ্যালেঞ্জের দিকে এগিয়ে যাব এবং আপনি যে কোনও সহায়তা দিতে পারেন তা প্রশংসিত হবে।
কুয়েনদা

@svick - শুভ ধরা, আমি ক্রম সুইচড t2.Completed এবং সত্য মান। আমি আরও একটি সমাধান যুক্ত করেছি যা আপনার পক্ষে কম অদ্ভুত হতে পারে।
অ্যাডুকি

40

আপনি এখানে যান:

from b in _dbContext.Burden 
join bl in _dbContext.BurdenLookups on
new { Organization_Type = b.Organization_Type_ID, Cost_Type = b.Cost_Type_ID } equals
new { Organization_Type = bl.Organization_Type_ID, Cost_Type = bl.Cost_Type_ID }

এটি আরও বোধগম্য মনে হচ্ছে।
বিজয় যাদব

1

আপনি এটি এর মতো করতে পারবেন না। joinদফা (এবং Join()এক্সটেনশান পদ্ধতি) শুধুমাত্র equijoins সমর্থন করে। এটি কারণ equalsএবং কেন এটি ব্যবহার করে না ==। এমনকি যদি আপনি এটির মতো কিছু করতে পারেন তবে এটি কার্যকর হবে না, কারণ joinএটি অভ্যন্তরীণ যোগদান, বাইরের যোগদান নয়।


বাইরের যোগদানের অনুরোধ করা হয়নি, এবং (অন্যান্য উত্তর দেখুন), সম্ভবত আপনি পারেন can
edc65

0

এটি 2 টেবিলের জন্য সূক্ষ্ম কাজ করে। আমার কাছে 3 টি টেবিল রয়েছে এবং ধারাটিতে 3 টি টেবিল থেকে 2 শর্ত লিঙ্ক করতে হবে। আমার কোড:

পি থেকে _ডিবি কনটেক্সট. প্রডাক্টস পিডি প্রডাক্টআইডি-তে সমান পিভিতে প্রডাক্টভ্যারেন্টস পিভি.প্রডুক্টআইডি-তে জেএসপি-তে যোগ করুন নতুন {ভ্যারিয়েন্টআইডি = পিভি.ভিড, প্রোডাক্টআইডি = পিডি প্রডাক্টআইডি-ভিডিয়েন্সিয়ড ProductId = jpr.Prices.ProduktID} in lj

তবে এই মুহুর্তে এটির ত্রুটি দেখানোর ক্ষেত্রে: পিডিকে _dbContext এ যোগ দিন p

ত্রুটি: যোগদানের ধারাটিতে যে কোনও একটির প্রকাশের ধরণ ভুল। টাইপ অনুমান 'গ্রুপজউইন'-এ কল করতে ব্যর্থ।

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