2010-12-09 7 views
0

Ich habe eine Motion Picture-Anwendung erstellt, um Schauspieler oder "Talente" zu verwalten. Ich habe eine TALENT-Tabelle und eine LANGUAGES-Tabelle. Ich habe auch eine TALENTLANGUAGES-Tabelle, die die Viele-zu-Viele-Beziehung zwischen den beiden zeigt.Linq zu sql. Viele zu viele Tisch beitreten

Hier ist die SQL ich kann schreiben, um die verschiedenen Sprachen zu zeigen, die ein bestimmtes Talent spricht.

Select t.TalentID, t.FirstName, tl.LanguageID, l.Name from Talent t 
inner join TalentLanguage tl on tl.TalentID = t.TalentID 
inner join Language l on l.LanguageID = tl.LanguageID 
where t.TalentID = 10000; 

Im in meiner C# -Anwendung verwende ich Linq zu SQL-Klassen. Wie kann ich den obigen Code mit linq zu SQL machen. Vielen Dank.

Antwort

0

Remus, ich denke, ich werde das selbst beantworten, weil es so eine saubere Lösung ist. Überprüfen Sie das heraus ...

var languages = from tl in talentDB.TalentLanguages 
       where tl.TalentID == id 
       select new { lang = tl.Language.Name, tal_id = tl.TalentID }; // could get more values if needed.. 

foreach (var l in languages) 
{ 
    string language = l.lang; 
    string talentID = l.tal_id; 
    // etc... 
} 

Das ist ziemlich cool! Linq hat den Beitritt für mich gemacht !!

+0

Der Typ 'var' erstellt im Grunde einen temporären Container mit Soft-Typ. Schön, dass das für dich geklappt hat. – Remus

+0

Ja das ist was ich in meinem Fall brauche, ein temporärer Container. Beide Lösungen sollten funktionieren. Vielen Dank. – RayLoveless

0

Hier ist eine Art und Weise Sie es tun können:

starten, indem Sie eine „Ergebnisse“ Objekt erstellen, etwas, das die Informationen halten, die Sie in einem Objekt benötigen. Nennen wir es „TalentLanguagesContainer“

public class TalentLanguagesContainer 
{ 
    public int TalentID { get; set; } 
    public string FirstName { get; set; } 
    public int LanguageID { get; set; } 
    public string LanguageName { get; set; } 
} 

Erstellen Sie dann eine Select-Anweisung, die Ihren Bedürfnissen entsprechend abbildet:

public IQueryable <TalentLanguagesContainer> GetTalentLanguages() 
{   
     MyDataContext _dataContext = new MyDataContext(); 

     return _dataContext.TalentLanguages 
        .Where(t => t.TalentID == 10000) 
        .Select(tl => new TalentLanguagesContainer() { 
          TalentID = tl.TalentID, 
          FirstName = tl.Talent.FirstName, 
          LanguageID = tl.LanguageID, 
          LanguageName = tl.Language.Name }); 
} 

Auch können Sie für komplexere Skripte wie dies das Schreiben von gespeicherten Prozeduren berücksichtigen ein - Sie finden vielleicht ein SQL-Skript, um auch schneller zu arbeiten.

+0

Remus, Danke für die Antwort. Sieht gut aus, ich denke, es gibt einen Fehler in Ihrer Where-Klausel. Gibt es eine Möglichkeit, dies zu tun, ohne einen Container zu erstellen. Ich bin wirklich neu in Linq. – RayLoveless

+0

Ich habe diesen Code nicht getestet - es könnte Fehler geben, der Ansatz ist, was Sie daraus machen sollten. Wie denkst du darüber, zurückgekommen zu sein, ohne einen Container zu bauen? – Remus

+0

oops - aktualisiert 'where' Anweisung zu verwenden "==" anstelle von "=", das wird wahrscheinlich den Fehler beheben, über den Sie gesprochen haben. – Remus