2

有四个表:

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 是否是正确的解决方案。

谢谢你的帮助。

4

3 回答 3

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
};

如果觉得有用请标记为答案

于 2013-07-16T07:12:18.897 回答
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()

好的,就像这样它正在工作,但这是将它与 distinct 和 join 一起使用的唯一方法......我不确定这是否是正确的解决方案(但它给了我正确的结果)......也许它可以优化了一点...

于 2013-07-16T07:05:19.817 回答
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
};
于 2013-07-16T06:57:40.440 回答