如何将指定SQL Server查询转换为Entity Framework语法?
将SQL查询转换为Entity Framework语法方案
嘿,我来帮你搞定这个SQL转EF的问题~ 你的需求是获取每个用户最新日期对应的那条记录对吧?下面给你几种常用的实现方式,都是和原SQL逻辑完全等价的:
1. 与原SQL结构一致的LINQ查询语法
这种写法和你原来的SQL结构几乎一一对应,很容易理解:
var result = from t in db.MyTable join tm in ( // 子查询:按用户名分组,取每个用户的最大日期 from mt in db.MyTable group mt by mt.username into userGroup select new { username = userGroup.Key, MaxDate = userGroup.Max(mt => mt.date) } ) on new { t.username, t.date } equals new { tm.username, tm.MaxDate } // 筛选出匹配的记录,返回需要的字段 select new { t.username, t.date, t.value };
2. LINQ方法语法
如果习惯链式调用的写法,可以用这种:
var result = db.MyTable .Join( // 先构建子查询:分组取最大日期 db.MyTable.GroupBy(mt => mt.username) .Select(userGroup => new { username = userGroup.Key, MaxDate = userGroup.Max(mt => mt.date) }), // 主表的关联条件 t => new { t.username, t.date }, // 子查询的关联条件 tm => new { tm.username, tm.MaxDate }, // 关联后返回的结果 (t, tm) => new { t.username, t.date, t.value } );
3. 更简洁的子查询过滤写法
这种写法逻辑更直观,直接筛选出每个用户中日期等于该用户最大日期的记录:
var result = db.MyTable .Where(t => t.date == db.MyTable .Where(mt => mt.username == t.username) .Max(mt => mt.date)) .Select(t => new { t.username, t.date, t.value });
4. EF Core专属的简洁写法(EF6不支持)
如果你用的是EF Core,还可以用分组后直接取最新记录的方式,代码更简洁:
var result = db.MyTable .GroupBy(mt => mt.username) .Select(userGroup => userGroup.OrderByDescending(mt => mt.date).FirstOrDefault()) .Select(t => new { t.username, t.date, t.value });
以上几种写法都能实现你原SQL的效果,你可以根据自己的习惯和项目中使用的EF版本来选择~
内容的提问来源于stack exchange,提问作者Adrian Reid
相关产品推荐
相关产品推荐

