选择asp.net c#EF问题中用户的所有标签

时间:2013-07-16 06:46:24

标签: c# asp.net sql-server entity-framework

有四个表格:

问题(questionId,question)
QuestionTags(questionTagId,questionId,tagId)
CodingKeys(codingKeyId,codingTypeId ..)
Codings(codingId,codingKeyId,coding ..)

我想选择所有问题tagIds及其编码(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
    };

但上述解决方案给了我双重结果。例如,如果一个标签包含在多个问题中,我会获得相同的标签两次(我尝试了不同的标签,但是没有用)。

我也尝试使用Any:

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)来解决这个问题,而且我也不确定它是否是正确的解决方案。

感谢您的帮助。

3 个答案:

答案 0 :(得分: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
    };

如果您觉得有用,请将其标记为答案

答案 1 :(得分: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的唯一方法......我不确定这是否是正确的解决方案(但它给了我正确的结果)...也许它可以优化一点......

答案 2 :(得分: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
};