如何在 EF Core 或 Linq 中编写此查询

Hui Liu-MSFT 40,666 信誉分 Microsoft 供应商
2024-03-29T07:11:36.5033333+00:00

您好, 我想在 linq 或 lambda EF core 中编写此查询

SELECT LAG(id) OVER ( ORDER BY ID ) AS PreviousWord ,ID ,LEAD(id) OVER ( ORDER BY ID ) AS NextWord FROM sales

请帮忙

Note:此问题总结整理于:How write this query in EF Core or Linq

Entity Framework Core
Entity Framework Core
实体框架数据访问技术的轻量型、可扩展、开源、跨平台版本。
38 个问题
0 个注释 无注释
{count} 票

接受的答案
  1. Jiale Xue - MSFT 34,201 信誉分 Microsoft 供应商
    2024-03-29T07:29:42.11+00:00

    根据 SQL 命令,我创建了一个包含以下数据的表,并修改了 SQL 查询命令以在使用 LAGLEAD 函数时设置默认值:

    118854-image.png

    然后,为了使用 EF core 获得相同的结果,我们可以使用以下代码:

    var result = _context.Sales.OrderBy(d => d.ID).Select(c => new  
    {  
        ID = c.ID,  
        PreviousId = _context.Sales.OrderBy(i => i.ID).Where(i => i.ID < c.ID).Select(i=>i.ID).LastOrDefault(),  
        NextId = _context.Sales.OrderBy(i => i.ID).Where(i => i.ID > c.ID).Select(i => i.ID).FirstOrDefault(),  
    }).ToList();  
    

    销售模式:

    public class Sale  
    {  
        [Key]  
        public int ID { get; set; }  
        public int SalesAmountQuota { get; set; }  
        public DateTime QuotaDate { get; set; }  
    }  
    

    此外,我们还可以使用扩展方法来执行 SQL 查询命令。FromSqlRaw

    根据 SQL 查询结果创建模型:

    public class SaleViewModel  
    {  
        public int ID { get; set; }  
        public int PreviousWord { get; set; }  
        public int NextWord { get; set; }  
    }  
    

    添加到 ApplicationDbContext:

    public class ApplicationDbContext: DbContext  
    {   
        public DbSet<Sale> Sales { get; set; }  
        public DbSet<SaleViewModel> SaleViewModels { get; set; }  
    

    然后,启用迁移以生成相关表,之后,在控制器中,使用以下代码获取结果:

    var sqlresult = _context.SaleViewModels  
        .FromSqlRaw("SELECT  ID ,LAG(ID,1,0) OVER ( ORDER BY ID ) AS PreviousWord , LEAD(ID,1,0) OVER ( ORDER BY ID ) AS NextWord FROM sales")   
        .Select(c=> new { ID = c.ID, PreviousID = c.PreviousWord, NextId = c.NextWord })  
        .ToList();  
    

    结果如下:

    118789-7.gif


    如果答案有帮助,请点击“接受答案”并点赞。 注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知。

    0 个注释 无注释

1 个其他答案

排序依据: 非常有帮助
  1. Deleted

    由于违反了我们的《行为准则》,此答案已被删除。 在采取措施之前,已通过自动检测手动报告或识别该答案。 有关详细信息,请参阅我们的行为准则


    已关闭批注。 了解详细信息