在.NET Core Razor Pages与EF中,用LINQ方法语法实现SQL虚拟列?
在Razor Pages + EF Core中实现LINQ版的SQL计算列
当然可以啦!在Entity Framework Core的LINQ查询里,你完全可以通过投影操作来实现和SQL虚拟/计算列一模一样的效果,不管是固定值还是基于实体属性的动态计算都没问题。结合你给出的现有查询,我给你两种常用的实现方式:
1. 使用匿名类型(快速临时场景)
如果这个计算列只是当前查询临时用,不需要复用,直接用匿名类型投影最方便:
// 假设你的Foo是实体类型,这里返回带计算列的匿名对象集合 var fooList = await _context.Foo .Where(r => !StatusExceptionList.Contains(r.Status)) .Where(r => (Convert.ToDateTime(r.Statusdate) - today).TotalDays < 31) .Where(r => r.DSRPID == PID) // 关键:通过Select添加计算列sortField .Select(r => new { // 可以选择保留整个实体,或者按需挑选需要的属性 OriginalFoo = r, sortField = 0 // 等价于SQL里的0 as 'sortField' }) .OrderBy(r => r.OriginalFoo.Submitteddate) .ThenBy(r => r.OriginalFoo.XXX) // 继续你的排序逻辑 .ToListAsync();
如果你不需要整个实体,只需要部分属性+计算列,也可以直接指定:
var fooList = await _context.Foo .Where(r => !StatusExceptionList.Contains(r.Status)) .Where(r => (Convert.ToDateTime(r.Statusdate) - today).TotalDays < 31) .Where(r => r.DSRPID == PID) .Select(r => new { r.Id, r.Status, r.Submitteddate, sortField = 0 // 自定义计算列 }) .OrderBy(r => r.Submitteddate) .ThenBy(r => ...) .ToListAsync();
2. 使用自定义DTO(复用场景)
如果这个带计算列的结构需要在多个查询或视图中复用,建议创建一个DTO(数据传输对象)类:
首先定义DTO:
public class FooWithSortDto { // 复制你需要的实体属性 public int Id { get; set; } public string Status { get; set; } public DateTime Submitteddate { get; set; } public string DSRPID { get; set; } // 你的计算列 public int sortField { get; set; } }
然后在查询中投影到这个DTO:
var fooList = await _context.Foo .Where(r => !StatusExceptionList.Contains(r.Status)) .Where(r => (Convert.ToDateTime(r.Statusdate) - today).TotalDays < 31) .Where(r => r.DSRPID == PID) .Select(r => new FooWithSortDto { Id = r.Id, Status = r.Status, Submitteddate = r.Submitteddate, DSRPID = r.DSRPID, sortField = 0 // 设置计算列的值 }) .OrderBy(r => r.Submitteddate) .ThenBy(r => ...) .ToListAsync();
额外提示
- 如果你的
sortField不是固定值,而是基于实体属性的动态计算(比如sortField = r.IsPriority ? 1 : 0),直接把计算逻辑写到Select里就行,EF Core会自动把它转换为对应的SQL计算语句。 - 要是你只是想用这个计算列做排序,甚至不需要投影出来,直接在OrderBy里写表达式即可:
.OrderBy(r => 0).ThenBy(r => r.Submitteddate),但如果需要把这个值传递给Razor视图展示,那投影是必须的。
内容的提问来源于stack exchange,提问作者ogg130
相关产品推荐
相关产品推荐

