首页 > 其他分享 >EF Core中Partition by实现

EF Core中Partition by实现

时间:2022-12-27 17:01:57浏览次数:42  
标签:Core Scrapdate Partition hps h0 EF t0 t1 EPC

一、SQL语句实现

Partition by是SQL Server数据库中提供的分区函数,跟Group by不同的是,Partition by能够按照分区返回所有记录,而Group by只能返回一条记录。

举个例子,有如下的数据库,需要找出每个唯一编号最新状态的数据。

显然,CW048201和CW048202它们的最新状态都是取消报废状态,用Group By去获取单行数据是无法获取的。这里我就可以借助于Partition By。

SQL语句如下:

select * from (
    select ROW_NUMBER() over (partition by EPC order by Scrapdate desc) as fid,* from [dbo].[hps_BaoFei]
) a  

语句执行结果如下:

可以看出分区函数Partitiion By按照编码分为了两个部分并且每个部分按照时间降序排列,因此我们只需再加一个条件即可获取每个编码的最新数据。

SQL语句如下:

select * from (
    select ROW_NUMBER() over (partition by EPC order by Scrapdate desc) as fid,* from [dbo].[hps_BaoFei]
) a where a.fid = 1 

语句执行结果如下:

二、EF Core的实现

直接上代码,我将其封装到了Web API里面,可以直接返回结果。

[HttpGet]
[Route("/api/GetBaofei")]
public List<hps_BaoFei> GetBaofei()
{
    using (BroadswordContext _bc = new BroadswordContext())
    {
        List<hps_BaoFei> list = (from p in _bc.hps_BaoFeis.Select(t => t.EPC).Distinct()
                                 from q in _bc.hps_BaoFeis
                                 .Where(t => t.EPC == p)
                                 .OrderByDescending(t => t.Scrapdate)
                                 .Take(1)
                                 select q).ToList();
        return list;
    }
}

注意其中的核心代码部分,我们可以Debug看一下其生成的SQL语句。

SELECT [t0].[id], [t0].[EPC], [t0].[Remarks], [t0].[ScrapRole], [t0].[ScrapState], [t0].[Scrapdate], [t0].[Scraptime]
FROM (
    SELECT DISTINCT [h].[EPC]
    FROM [hps_BaoFei] AS [h]
) AS [t]
INNER JOIN (
    SELECT [t1].[id], [t1].[EPC], [t1].[Remarks], [t1].[ScrapRole], [t1].[ScrapState], [t1].[Scrapdate], [t1].[Scraptime]
    FROM (
        SELECT [h0].[id], [h0].[EPC], [h0].[Remarks], [h0].[ScrapRole], [h0].[ScrapState], [h0].[Scrapdate], [h0].[Scraptime], ROW_NUMBER() OVER(PARTITION BY [h0].[EPC] ORDER BY [h0].[Scrapdate] DESC) AS [row]
        FROM [hps_BaoFei] AS [h0]
    ) AS [t1]
    WHERE [t1].[row] <= 1
) AS [t0] ON [t].[EPC] = [t0].[EPC]

执行结果:

 

标签:Core,Scrapdate,Partition,hps,h0,EF,t0,t1,EPC
From: https://www.cnblogs.com/guwei4037/p/17008441.html

相关文章

  • centos7部署dotnetcore webpai
    1.进入宝塔ssh2.安装dotnetcoresdksudoyuminstalldotnet-sdk-6.03.上传文件4.新建一个网站,网址www.localhost8892.com:88925.设置反向代理,填写目标URL:http://lo......
  • SiteFactory支持Word图片一键上传
    ​ 当前功能基于PHP,其它语言流程大抵相同。大概流程:1.将docx文件上传到服务器中2.使用PHPoffice/PHPword实现将word转换为HTML3.将HTML代码返回并赋值到编辑器中......
  • SiteFactory支持Word图片一键导入
    ​ 当前功能基于PHP,其它语言流程大致相同 1.新增上传wordjson配置在ueditor\php\config.json中新增如下配置:     /* 上传word配置 */    "wordAction......
  • SiteFactory支持Word图片自动粘贴
    ​ 1.编辑器修改(可选)1.1在 ueditor/config.json 中添加代码块    /* 上传word配置 */    "wordActionName":"wordupload",/* 执行上传视频的action......
  • CompletableFuture
    CompletableFutureFutureFuture接口(FutureTask实现类)定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行......
  • Vue技术6.1回顾Object.defineproperty方法
    <!DOCTYPEhtml><html><head><matacharset="UTF-8"/><title>回顾Object.defineproperty方法</title></head><body><scripttype="te......
  • Kubernetes StatefulSet 控制器(二十一)
    前面我们学习了Deployment和ReplicaSet两种资源对象得使用,在实际使用的过程中,Deployment并不能编排所有类型的应用,对无状态服务编排是非常容易的,但是对于有状态服务就......
  • SiteFactory支持Word图片自动上传
    ​图片的复制无非有两种方法,一种是图片直接上传到服务器,另外一种转换成二进制流的base64码目前限chrome浏览器使用首先以um-editor的二进制流保存为例:打开umeditor.js,......
  • vue3_03ref操作复杂类型
    ref也可以将复杂类型的数据转换为响应式数据,使用方法和处理简单类型数据一样leta=ref(复杂类型数据)a.value.xxx<template><p>{{objref.num}}</p><button@c......
  • vue3_04ref获取标签
    ref也可以用来获取dom节点分为三步:1.给节点绑定ref='xxx'2.letxxx=ref()3.在挂载之后直接使用即可<template><divref="op">24</div><p>{{num}}</p>......