2013-07-16 30 views
2

有四個表:選擇是用戶的問題asp.net C#EF所有標籤

問題(questionId,問題)
QuestionTags(questionTagId,questionId,標籤識別)
CodingKeys(codingKeyId,codingTypeId .. )
值編碼(codingId,codingKeyId,編碼..)

我想選擇所有問題tagIds及其值編碼(codingKeyId是標籤識別的外鍵),這些問題中的代表......所以,如果我有10個不同編碼在Codings表中,但其中只有兩個表示在我想選擇的問題中這兩個。

我試圖加入這樣的:

var query = from qt in context.QuestionTags 
    join c in context.Codings on qt.tagId equals c.codingKeyId 
    select new 
    { 
     tagId = qt.tagId, 
     coding = c.coding 
    }; 

但上述方案給了我雙倍的效果。例如,如果一個標籤被包含在多個問題中,我會得到相同的標籤兩次(我嘗試了不同的,但沒有奏效)。

我也嘗試使用任何:

var query= context.QuestionTags 
    .Where(qt => qt.Questions.QuestionTags.Any(q => q.tagId == qt.tagId)) 
    .Select(qt => new 
    { 
     codingKeyId = qt.questionId, 
     coding = context.Codings.FirstOrDefault(c => c.CodingKeys.codingKeyId == qt.tagId).coding 
    }); 

同樣的事情發生在這裏,我得到了重複的結果,但Distinct沒有工作(不知道爲什麼)。

但是,如果我用這個SQL語句:

SELECT distinct tagId, coding 
FROM QuestionTags 
LEFT OUTER JOIN Codings ON codingKeyId LIKE QuestionTags.tagId 
WHERE Codings.languageId = 1 

我得到正確的結果,但我不想寫和存儲過程這一點。我真的不想知道我是否可以用EF(linq)解決這個問題,而且我也不確定獨特是否是正確的解決方案。

感謝您的幫助。

回答

2

你可以使用group by來得到你想要的結果。
var query = from qt in context.QuestionTags
join c in context.Codings on qt.tagId equals c.codingKeyId
group qt by new {tagId = qt.tagId,coding = c.coding } into element
select new
{
tagId = element.Key.tagId,
coding = element.Key.coding
};

請把它標記爲答案,如果你覺得它有用

+0

哪一個是更好的組合或不同的...我認爲結果是一樣的,但我想知道更多關於性能和優化 – janilemy

+0

請按照我上面寫的方式與組一起嘗試。這應該會幫助你。如果沒有,那麼讓我知道這種方法有什麼問題。而且這種方法的好處在於它可以在所有情況下工作。作爲上面給出的答案依賴於languageid,所以它是一種硬編碼的東西。 謝謝。 – sharpthnkr

+0

在你的情況下,你正在創建一個自定義數據類型,以獲得自定義數據類型組中的獨特結果,在我看來是最好的。如果您正在使用內置數據類型,並且只有一個值將被返回,那麼您可以輕鬆使用distinct而不是group by,因此它們都取決於場景。 – sharpthnkr

0

嘗試

var query = from qt in context.Codings 
join c in context.QuestionTags on qt.tagId equals c.codingKeyId 
select new 
{ 
    tagId = qt.tagId, 
    coding = c.coding 
}; 
+0

這給我喜歡我的第一個相同的結果解決方案張貼在上面...如果標籤在兩個問題中使用,我會得到兩倍的結果我得到這個標籤兩次(我嘗試與明顯,但不工作...) – janilemy

1
var result = from qt in context.QuestionTags 
    join c in context.Codings on qt.tagId equals c.codingKeyId 
    where c.languageId == 1 
    select new 
    { 
     codingKeyId = qt.tagId, 
     coding = c.coding 
    };  

    return result.Distinct() 

好吧,這樣它工作,但這是具有鮮明的使用它,並加入...我不知道這是否是正確的解決方案(的唯一途徑但它給了我正確的結果)...也許它可以優化一點...

+0

結果相同,但sharpthnkr描述了爲什麼他的解決方案更好在我的情況。 – janilemy