You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:18:12