2012-07-24 12 views
7

एंटिटी फ्रेमवर्क/LINQ का उपयोग करके कैसे पूछूं, मुझे निम्नलिखित में सहायता चाहिए।मैं एक जंक्शन तालिका

डेटाबेस में व्यक्ति आईडी की पहचान कॉलम वाले लोगों की एक तालिका है। SkillId के पहचान कॉलम के साथ एक कौशल तालिका भी है। ये दोनों एक तीसरी टेबल पीपुल्सस्कल्स के माध्यम से जुड़े हुए हैं जिनके पास अपना स्वयं का पहचान कॉलम पीपुल्सस्किलआईडी है, जो व्यक्तिगत आईडी संदर्भित एक विदेशी कॉलम है और कौशल आईडीडी संदर्भित एक विदेशी कॉलम है।

जिस विधि को मैं लिखने की कोशिश कर रहा हूं उसे टाइप सूची का एक पैरामीटर पारित किया गया है जिसमें कोई भी कौशल शामिल है जिसे हम ढूंढ रहे हैं। विधि को एक सूची वापस करनी चाहिए जो इनपुट पैरामीटर सूची में सभी कौशल से जुड़ा हुआ है। मैं ऐसी सूची कैसे बना सकता हूं जिसमें कौशल सूची में सभी कौशल के बिना किसी को शामिल न किया जाए?

मेरी समस्या यह है कि मेरे पास बहुत कम SQL अनुभव है। मेरे पास बहुत सारे प्रोग्रामिंग अनुभव हैं, लेकिन एसक्यूएल हमेशा मेरे लिए थोड़ा मोटा है। मैंने एक जॉइन का उपयोग करने के बारे में सोचा, लेकिन यह काम नहीं करेगा। यानी अगर मेरे व्यक्ति के पास कौशल A & बी है, और खोज सूची में बी & सी के लिए तत्व हैं, तो एक जुड़ें बी पर मेल खाएगी और व्यक्ति को वापस कर देगी। मुझे इस व्यक्ति को बाहर रखा जाना चाहिए क्योंकि उसके पास बी & सी

मैंने कौशल सूची के माध्यम से पुनरावृत्ति और फ़िल्टर बनाने के बारे में भी सोचा था, लेकिन यह बदसूरत लगता है। यह सिर्फ एक समस्या की तरह लगता है कि LINQ को किसी अन्य सूची से पूछताछ करने के लिए सूची का उपयोग करके, संभालने के लिए बनाया गया था, और यह कि एक सुरुचिपूर्ण समाधान होना चाहिए।

+1

मैं इसे कुछ विचार देना चाहता हूं; एक व्यापक उत्तर के साथ अगले 24 घंटों में मैं आपसे वापस आऊंगा, अगर किसी और ने पहले से ऐसा नहीं किया है। –

उत्तर

0

यह काम कर सकता था:

public List<Person> GetPeopleWithAllSkills(List<Skill> skills) 
{ 
    var skillIds = skills.Select(s => s.SkillId); 

    return context.People.Where(
     p => skillIds.All(id => p.PeopleSkills.Any(ps => ps.SkillId == id))) 
     .ToList(); 
} 

मुझे लोगों की है कि इस शर्त पर कि सभी दिया कौशल मौजूद हैं (Any) उन लोगों के कौशल की सूची में पूरा दे। (उनके पास दिए गए कौशल से अधिक हो सकता है लेकिन कम नहीं।)

+0

दोनों उत्तरों ने मुझे थोड़ा सा दिखाया, लेकिन यह आश्चर्यजनक रूप से सरल तरीका है जिसे मैं कल्पना कर रहा था। प्रतिभाशाली। –

1

मैंने लिंककैड का उपयोग किया, जो लिंक से इकाइयों के बजाय लिंक-टू-एसक्यूएल का उपयोग करता है, लेकिन अवधारणाएं समान होनी चाहिए।

सबसे पहले, डेटा का परीक्षण करने के लिए उपयोग किया जाता था।

create table People (PersonID int, Name varchar(100)) 
create table Skills (SkillID int, Skill varchar(100)) 
create table PeopleSkills (PeopleSkillsID int, PersonID int, SkillID int) 

insert People values (1,'Bert'),(2,'Bob'),(3,'Phil'),(4,'Janet') 
insert Skills values (1,'C#'),(2,'Linq'),(3,'SQL') 
insert PeopleSkills values (1,1,1),(2,1,2),(3,1,3),(4,2,1),(5,2,3),(6,3,2),(7,3,3),(8,4,1),(9,4,2),(10,4,3) 

और समाधान।

//I don't know how you are specifying your list of skills; for explanatory purposes 
//I just generate a list. So, our test skill set is C#, Linq, and SQL. 
//int? is used because of LinqToSQL complains about converting int? to int 
var skills = new List<int?>(){1,2,3}; 
//This initial query is also a small bow to LinqToSQL; Really I just wanted a plain 
//List so that the Except and Any clauses can be used in the final query. 
//LinqToSQL can apparently only use Contains; that may or may not be an issue with 
//LinqToEntities. Also, its not a bad idea to filter the people we need to look at 
//in case there are a large number anyway. 
var peopleOfInterest = PeopleSkills.Where(p => skills.Contains(p.SkillID)).ToList(); 

//Final query is relatively simple, using the !x.Except(y).Any() method to 
//determine if one list is a subset of another or not. 
var peopleWithAllSkills = 
    //Get a distinct list of people 
    from person in peopleOfInterest.Select(p=>p.PersonID).Distinct() 
    //determine what skills they have 
    let personSkills = peopleOfInterest.Where(x=>x.PersonID == person).Select(x=>x.SkillID) 
    //check to see if any of the skills we are looking for are not skills they have 
    where !skills.Except(personSkills).Any() 
    select person; 
+0

धन्यवाद। मैं कभी साथ नहीं आया होता! किसी को छोड़कर। –

संबंधित मुद्दे