問題(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)解決這個問題,而且我也不確定獨特是否是正確的解決方案。
感謝您的幫助。
哪一個是更好的組合或不同的...我認爲結果是一樣的,但我想知道更多關於性能和優化 – janilemy
請按照我上面寫的方式與組一起嘗試。這應該會幫助你。如果沒有,那麼讓我知道這種方法有什麼問題。而且這種方法的好處在於它可以在所有情況下工作。作爲上面給出的答案依賴於languageid,所以它是一種硬編碼的東西。 謝謝。 – sharpthnkr
在你的情況下,你正在創建一個自定義數據類型,以獲得自定義數據類型組中的獨特結果,在我看來是最好的。如果您正在使用內置數據類型,並且只有一個值將被返回,那麼您可以輕鬆使用distinct而不是group by,因此它們都取決於場景。 – sharpthnkr