2010-12-09 123 views
0

我一直在構建一個電影應用程序來管理演員或「人才」。我有一個TALENT表和一個LANGUAGES表。我也有一個TALENTLANGUAGES表,顯示兩者之間的多對多關係。Linq to sql。多對多表加入

這裏是我可以編寫的SQL來顯示特定天賦所說的不同語言。

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; 

我在我的C#應用​​程序我使用Linq的SQL類。我怎麼可以用linq to sql來完成上面的代碼。謝謝。

回答

0

Remus,我想我會自己回答這個問題,因爲這是一個很乾淨的解決方案。看看這個...

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... 
} 

這很酷! Linq爲我做了加入!

0

這裏是你可以做到這一點的一種方法:

開始通過創建一個「結果」的對象,一些將持有你在一個對象所需要的信息。讓我們把它稱爲「TalentLanguagesContainer」

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

然後,創建一個選擇語句,將您的需求正確地映射:

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 }); 
} 

而且,你可能要考慮編寫存儲過程進行更復雜的腳本,如本一個 - 你可能會發現一個SQL腳本執行得更快。

+0

Remus,謝謝你的迴應。看起來不錯,我認爲你的Where子句有一個錯誤。有沒有辦法做到這一點,而不創建一個容器。我對linq真的很陌生。 – RayLoveless 2010-12-09 17:35:18

+0

我還沒有測試過這個代碼 - 可能有錯誤,但是這個方法就是你應該從中取得的。至於在沒有創建容器的情況下做這件事,你以爲回到了什麼? – Remus 2010-12-09 17:37:56