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

C# 选择asp.net c EF中用户问题的所有标记,c#,asp.net,sql-server,entity-framework,C#,Asp.net,Sql Server,Entity Framework,共有四个表格: 问号,问号 QuestionTagsquestionTagId,questionId,tagId CodingKeyscodingKeyId,codingTypeId。。 CodingCodingID,codingKeyId,编码 我想选择所有问题标记ID及其编码codingKeyId是问题中表示的标记ID的外键。。。所以,如果我在编码表中有10个不同的编码,但只有其中两个在问题中表示,我只想选择这两个 我试过这样加入: var query = from qt in contex

共有四个表格:

问号,问号 QuestionTagsquestionTagId,questionId,tagId CodingKeyscodingKeyId,codingTypeId。。 CodingCodingID,codingKeyId,编码

我想选择所有问题标记ID及其编码codingKeyId是问题中表示的标记ID的外键。。。所以,如果我在编码表中有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
    };
但上述解决方案给了我双重结果。例如,如果一个标签包含在一个以上的问题中,我会得到相同的标签两次,我尝试了distinct,但没有成功

我也尝试过使用任何:

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

谢谢你的帮助。

试试看

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

好的,就像这样,它正在工作,但这是唯一的方法使用它与独特和加入。。。我不确定这是否是正确的解决方案,但它给了我正确的结果。。。也许可以对它进行一些优化…

您可以使用group by来获得您想要的结果。 var query=来自context.QuestionTags中的qt 在上下文中连接c。qt.tagId上的编码等于c.codingKeyId 通过新的{tagId=qt.tagId,coding=c.coding}将qt分组到元素中 选择新的 { tagId=element.Key.tagId, 编码=element.Key.coding };


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

这将给我与上面发布的第一个解决方案相同的结果。。。如果在两个问题中使用标签,我会得到双倍的结果。我两次得到这个标签。我尝试使用distinct,但不起作用…哪一个更好分组或distinct。。。我认为结果是一样的,但我想知道更多关于性能和优化的信息,请按照我上面写的方式与group一起尝试。这应该对你有所帮助。如果没有,那么让我知道这种方法的问题是什么。这种方法的好处是,它在所有情况下都能起作用。上面给出的答案取决于languageid,所以这是一种硬编码。谢谢。在您的情况下,您正在创建一个自定义数据类型,因此在我看来,通过group by在自定义数据类型中获得唯一的结果是最好的。如果您使用的是内置数据类型,并且只返回一个以上的值,那么您可以很容易地使用distinct而不是group by,因此它们都取决于场景。在您的场景中,根据我,group by适合您:Ok for your efford and everything。。。你的解决方案和我的一样。。。你给我一些新的信息,我相信你的解释。。感谢同样的结果,但sharpthnkr向我描述了为什么他的解决方案比我的更好。
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()