有四个表:
Questions(questionId, question)
QuestionTags(questionTagId, questionId, tagId)
CodingKeys(codingKeyId, codingTypeId ..) Codings
(codingId, codingKeyId, coding ..)
我想选择问题中表示的所有问题 tagId 及其编码(codingKeyId 是 tagId 的外键)...因此,如果我在 Codings 表中有 10 个不同的编码但其中只有两个在我只想选择的问题中表示这两个。
我试过这样加入:
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) 解决这个问题,而且我也不确定 distinct 是否是正确的解决方案。
谢谢你的帮助。