Linq to sql Linq到sql。多对多表联接

Linq to sql Linq到sql。多对多表联接,linq-to-sql,many-to-many,Linq To Sql,Many To Many,我一直在构建一个电影应用程序来管理演员或人才。我有一个天赋表和一个语言表。我还有一个TALENTLANGUAGES表,显示了两者之间的多对多关系 下面是我可以编写的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

我一直在构建一个电影应用程序来管理演员或人才。我有一个天赋表和一个语言表。我还有一个TALENTLANGUAGES表,显示了两者之间的多对多关系

下面是我可以编写的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类。如何使用LINQtoSQL执行上述代码。谢谢。

以下是一种方法:

首先创建一个results对象,它将保存一个对象中所需的信息。让我们称之为天才语言容器

public class TalentLanguagesContainer
{
    public int TalentID { get; set; }
    public string FirstName { get; set; }
    public int LanguageID { get; set; }
    public string LanguageName { get; set; }
}
然后,创建一个Select语句,该语句将适当映射您的需求:

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脚本执行得更快。

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

这太酷了!林克帮我加入了

雷姆斯,谢谢你的回复。看起来不错,我觉得你的Where子句有个漏洞。有没有一种方法可以在不创建容器的情况下执行此操作。我对linq真的是个新手。我还没有测试过这段代码——可能有bug,不过这种方法是你应该从中吸取的。至于在不创建容器的情况下执行此操作,您在考虑返回什么?oops-将“where”语句更新为使用==,而不是=,这可能会修复您所说的错误。不,我不认为您可以这样做where。无论如何,我没有得到任何IntelliSense.“var”类型基本上创建了一个软类型的临时容器。很高兴这对你有用。是的,这就是我需要的,一个临时容器。这两种解决方案都应该有效。谢谢