如何用C# Entity Framework实现等效于指定SQL查询的逻辑?
使用Entity Framework实现对应SQL查询的方案
原SQL的逻辑是:对contractinvoiceperday表的每一行,从CreatedDate、SubmittedDate、ApprovedDate、CATStaffApprovedDate四个日期字段中取最大值,作为LastModifiedDate返回。以下是不同EF版本的实现方式:
方式一:EF Core 3.0+ 简洁写法
利用LINQ的数组Max方法,EF Core会自动将其转换为等价的SQL逻辑:
using (var dbContext = new YourDbContext()) { var query = dbContext.ContractInvoicePerDay .Select(c => new { LastModifiedDate = new[] { c.CreatedDate, c.SubmittedDate, c.ApprovedDate, c.CATStaffApprovedDate } .Max(date => date) }); // 执行查询并获取结果 var result = query.ToList(); }
方式二:EF6 兼容写法
EF6不支持数组Max的SQL转换,需要通过嵌套条件判断来实现取最大值:
using (var dbContext = new YourDbContext()) { var query = dbContext.ContractInvoicePerDay .Select(c => new { LastModifiedDate = c.CreatedDate > c.SubmittedDate ? (c.CreatedDate > c.ApprovedDate ? (c.CreatedDate > c.CATStaffApprovedDate ? c.CreatedDate : c.CATStaffApprovedDate) : (c.ApprovedDate > c.CATStaffApprovedDate ? c.ApprovedDate : c.CATStaffApprovedDate)) : (c.SubmittedDate > c.ApprovedDate ? (c.SubmittedDate > c.CATStaffApprovedDate ? c.SubmittedDate : c.CATStaffApprovedDate) : (c.ApprovedDate > c.CATStaffApprovedDate ? c.ApprovedDate : c.CATStaffApprovedDate)) }); var result = query.ToList(); }
方式三:模拟原SQL的VALUES子句(EF Core/EF6通用)
如果希望完全贴合原SQL的逻辑结构,可以通过嵌入原生SQL片段实现:
using (var dbContext = new YourDbContext()) { var query = dbContext.ContractInvoicePerDay .Select(c => new { LastModifiedDate = dbContext.Set<DateTime?>() .FromSqlRaw("SELECT MAX(LastModifiedDate) FROM (VALUES ({0}), ({1}), ({2}), ({3})) AS UpdateDate(LastModifiedDate)", c.CreatedDate, c.SubmittedDate, c.ApprovedDate, c.CATStaffApprovedDate) .FirstOrDefault() }); var result = query.ToList(); }
注意事项
- 如果字段允许为
null,需要处理空值情况,比如在数组中过滤掉null再取Max,或者在条件判断中加入空值检查。 - 确保
YourDbContext中已正确映射ContractInvoicePerDay实体与数据库表。
内容的提问来源于stack exchange,提问作者user13089838
相关产品推荐
相关产品推荐

