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

Hui Liu-MSFT 48,711 信誉分 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

开发人员技术 | .NET | Entity Framework Core
0 个注释 无注释

问题作者接受的答案

匿名
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. 已删除

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


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

你的答案

提问者可以将答案标记为“已接受”,审查方可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。