2011-12-28 91 views
1

我有三個表具有以下,簡化架構:LINQ to SQL的多對多的問題

Articles 
    articleID 
ArticleAuthors 
    articleID 
    authorID 
Authors 
    authorID 

一篇文章可以有多個作者。

鑑於輸入文章,我想找到輸入文章的作者寫的所有其他文章。 所以,如果喬和吉爾寫第1條,我想要喬或吉爾寫的所有其他文章。我需要的東西,以滿足以下功能:

public Article[] articlesBySameAuthors(Article article) {} 

在SQL中,我只是這樣做:

SELECT * FROM Articles A 
INNER JOIN ArticleAuthors AA ON A.articleID = AA.articleID 
WHERE AA.authorID IN (SELECT authorID FROM ArticleAuthors 
    WHERE articleID = @articleID) AND A.articleID <> @articleID; 

但我真的想知道如何做到這一點的LINQ to SQL。

謝謝。

回答

0

這些幫助嗎?

Joins

Nested groups

逐字翻譯將是愚蠢的 - 我會假設你有比這更好的對象結構。如果您需要更多關於特定對象結構的細節,請發佈它。

0

這個僞函數假設你已經獲得articlesarticleAuthorsauthors別處:

Article[] ArticlesBySameAuthors(Article article) 
{ 
    return 
     (from a in articles 
     where a.ArticleID = article.ArticleID 
     join articleAuthor in articleAuthors on a.ArticleID equals articleAuthor.ArticleID 
     join author in authors on articleAuthor.AuthorID equals author.AuthorID 
     select author).ToArray(); 
} 

編輯:

前面的是一個疲憊的心靈的產物。這裏的另一個走:

Article[] ArticlesBySameAuthors(Article article) 
{ 
    return 
     (from a in articles 
     where a.ArticleID = article.ArticleID 
     join articleAuthor in articleAuthors on a.ArticleID equals articleAuthor.ArticleID 
     join articleAuthor2 in articleAuthors on articleAuthor.AuthorID equals articleAuthor2.AuthorID 
     join article2 in articles on articleAuthor2.ArticleID = article2.ArticleID 
     where article2.ArticleID != article.ArticleID 
     select article2).ToArray(); 
} 

或者,假設Article類型有一個Authors收集,反之亦然,下面可以做:

Article[] ArticlesBySameAuthors(Article article) 
{ 
    return 
     (from author in article.Authors 
     from article2 in author.Articles 
     where article2.ArticleID != article.ArticleID 
     select article2).ToArray(); 
} 
+0

這不起作用。它返回與原始文章相同的文章乘以原作者的數量。蝙蝠,你說a.ArticleID = article.ArticleID,這將限制我們到原來的同一篇文章。最後你說選擇作者,我認爲你的意思是選擇一個。 – Calvin 2011-12-29 00:06:28

+0

@Calvin當然你是對的,我在創建查詢時忽略了目標。請參閱編輯過的文章,瞭解其他幾種方法。 – phoog 2011-12-29 14:30:59

0
var list = (
    from articleAuthor in articleAuthors 
    from article in articles 
    where articleAuthor.articleID == article.articleID 
    where (from aa in articleAuthors where aa.articleID == requested_article_id select aa.authorID).Contains(articleAuthor.authorID) 
    select article).Distinct().ToList(); 
+0

與第1號響應相同嗎? – Calvin 2011-12-29 00:26:27

+0

好,我已更正了代碼,請檢查它 – 2011-12-29 12:06:33

0

沿着這條線的東西...

Var auth = db.ArticleAuthors.where(a=>a.Article == article).Select(Aa=>aa.author) 

Var result = from aa in Db.articleauthors 
       Were auth.Contains(aa.author) 
    Select aa.Article