如何将含内连接的SQL查询转换为LINQ?附复杂SQL转C#代码求助
如何将带分组内连接的SQL转换为LINQ(C#)
没问题,我来帮你把这条SQL转换成对应的LINQ查询!先拆解下你的SQL逻辑:它是要找出Type='Enter'的记录里,每个Message对应的最新(最大CreatedDate)那条记录的Message字段。下面给你两种常见的LINQ写法,都能实现这个需求:
查询语法版本(和你写简单查询的风格一致)
这种写法和SQL的结构最接近,容易理解:
var query = from t in db.tblA // 先定义子查询:分组Message,取每个组的最大CreatedDate join tm in ( from a in db.tblA group a by a.Message into grouped select new { Message = grouped.Key, MaxDate = grouped.Max(item => item.CreatedDate) } ) // 按Message和CreatedDate=MaxDate做内连接 on new { t.Message, t.CreatedDate } equals new { tm.Message, tm.MaxDate } // 过滤Type为Enter的记录 where t.Type == "Enter" // 选择需要的Message字段 select t.Message; // 如果要获取单个结果,和你之前的写法一样用FirstOrDefault() var singleResult = query.FirstOrDefault();
方法语法版本(流畅API)
如果习惯链式调用的写法,也可以用这种方式:
// 先定义子查询逻辑 var latestMessageDates = db.tblA .GroupBy(a => a.Message) .Select(grouped => new { Message = grouped.Key, MaxDate = grouped.Max(item => item.CreatedDate) }); // 主查询做内连接+过滤+选择字段 var query = db.tblA .Join(latestMessageDates, // 主表的匹配键:Message和CreatedDate t => new { t.Message, t.CreatedDate }, // 子查询的匹配键:Message和MaxDate tm => new { tm.Message, tm.MaxDate }, // 连接后返回主表的记录 (t, tm) => t) .Where(t => t.Type == "Enter") .Select(t => t.Message); var singleResult = query.FirstOrDefault();
额外说明
- 两种写法逻辑完全一致,你可以根据自己的习惯选择;
- 如果需要获取完整的记录(而不只是
Message字段),把最后的select t.Message改成select t即可; - 匿名类型的字段名和类型必须完全匹配才能成功连接,这里我们用匿名类型同时匹配
Message和日期字段,和SQL里的on t.Message = tm.Message and t.CreatedDate = tm.MaxDate逻辑对应。
内容的提问来源于stack exchange,提问作者user7575848
相关产品推荐
相关产品推荐

