加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 01:42:42 所属栏目:百科 来源:网络整理
导读:如何将以下SQL语句转换为Lambda表达式或 Linq查询? 以下查询获取每个问题的单个最新答案.或者用另一种方式表达,用最新的答案得到每个问题. 这也将由Entity Framework执行. SELECT Answers.*FROM AnswersWhere AnswerID IN( SELECT Max(AnswerID) AnswerID F
如何将以下SQL语句转换为Lambda表达式或 Linq查询?

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

这也将由Entity Framework执行.

SELECT Answers.*
FROM Answers
Where AnswerID IN
(
    SELECT Max(AnswerID) AnswerID
    FROM Answers
    GROUP BY QuestionID
)

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

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

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

解决方法

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

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;

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

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

var query = from a in answers
             join s in subQuery on a.AnswerID equals s.MaxAnswerID
             select a;

这导致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;

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读