将SQL子查询转换为In到Linq Lambda

Mik*_*Dev 3 c# sql linq linq-to-entities entity-framework

如何将以下SQL语句转换为Lambda表达式或Linq查询?

以下查询获取每个问题的单个最新答案.或者用另一种方式表达,用最新的答案得到每个问题.

这也将由Entity Framework执行.

SELECT Answers.*
FROM Answers
Where AnswerID IN
(
    SELECT Max(AnswerID) AnswerID
    FROM Answers
    GROUP BY QuestionID
)
Run Code Online (Sandbox Code Playgroud)

这是使用Inner Join查看上一个查询的另一种方法

SELECT answers.* 
FROM answers 
INNER JOIN  
(
     SELECT Max(answerID) answerID --,  QuestionSiteID
     FROM answers
     GROUP BY QuestionID 
) t ON
     answers.answerID = t.answerID  
Run Code Online (Sandbox Code Playgroud)

我已经读过LINQ Contains方法对于访问SQL的查询来说是次优的.
LINQ to Sql和.Contains()陷阱.

Stu*_*art 5

我想你可以用以下方法做到这一点:

 var subQuery = from a in answers
                group a by a.QuestionID into grouping
                select new
                {
                    QuestionID = grouping.Key,
                    MaxAnswerID = grouping.Max(x => x.AnswerID)
                };

 var query = from a in answers
             from s in subQuery
             where a.AnswerID == s.MaxAnswerID
             select a;
Run Code Online (Sandbox Code Playgroud)

这会在生成的SQL中生成CROSS JOIN


此外,您可以join在查询的第二部分中使用:

 var query = from a in answers
             join s in subQuery on a.AnswerID equals s.MaxAnswerID
             select a;
Run Code Online (Sandbox Code Playgroud)

这导致SQL中的INNER JOIN


关于附带案例的注意事项 - 上面的答案做出了合理的假设 - 这AnswerID是主键Answers- 如果碰巧有一个键入的表设计(AnswerID,QuestionID),那么你需要通过AnswerID和QuestionID加入,如:

 var subQuery = from a in answers
                group a by a.QuestionID into grouping
                select new
                {
                    QuestionID = grouping.Key,
                    MaxAnswerID = grouping.Max(x => x.AnswerID)
                };

 var query = from a in answers
             from s in subQuery
             where a.AnswerID == s.MaxAnswerID
             && a.QuestionID == s.QuestionID
             select a;
Run Code Online (Sandbox Code Playgroud)

有关此备用表设计的更多讨论,请参阅注释跟踪...