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()陷阱.
我想你可以用以下方法做到这一点:
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)
有关此备用表设计的更多讨论,请参阅注释跟踪...