【问题标题】:Filtering a View with row_number for generating serial number使用 row_number 过滤视图以生成序列号
【发布时间】:2019-09-18 19:55:57
【问题描述】:

我有这样的看法。

Create view RefStatus
as
select row_number() over(order by Inserted_On desc) Slno, Name,
Email_ID Email, Mobile_No Mobile, Status, Inserted_On ProfileCreatedOn from RefTable

现在

select  Slno, Name,
 Email,  Mobile, Status,  ProfileCreatedOn from RefStatus

很好,我得到了预期的序列号。但是当我尝试

select  Slno, Name,
 Email,  Mobile, Status,  ProfileCreatedOn from RefStatus where Status = 'In-Progress'

我的序列号没有正确生成。它仍然将我表的所有记录视为基础并生成不正确的序列号。 如何单独为过滤的行生成序列号。

我知道这可以通过存储过程或为每个状态创建单独的视图来完成。有没有办法在同一个视图中做到这一点?原因是我需要从 C# 调用这个视图,使用实体框架和 linq。

【问题讨论】:

  • 你在RefTable表中没有PK吗?
  • 不,实际上我没有任何 RefTable,为了简单起见,我提到了它,我的实际选择查询是一个大查询,有多个内部连接和大约 15 个表的左连接
  • 如果您要使用此序列号来识别一行,那么这将无济于事,因为Inserted_On 列数据可能会改变这意味着SerialNo 也会改变.
  • 不,我不会使用该密钥更新任何内容,我实际上希望 SlNo 使用过滤后的数据进行更改,但它没有发生。 SlNo 与行的过滤和未过滤数据保持相同。
  • 好吧,那么@Prasanth Kumar Vinakota 你已经有了答案。

标签: c# sql-server entity-framework linq filtering


【解决方案1】:

在视图中生成的ROW_NUMBER() 不是动态的,因为它不会在您过滤视图时动态更改。

在查询而不是视图中使用ROW_NUMBER():

select  
    row_number() over(order by Inserted_On desc) SlNo, 
    Name,
    Email,  
    Mobile, 
    Status,  
    ProfileCreatedOn,
from RefStatus
where Status = 'In-Progress'

【讨论】:

  • 最终我需要使用实体框架 linq 从 C# 调用此视图。是否可以在 C# 中做到这一点。
  • @PrasanthKumarVinakota:是的,你当然可以从 c# 运行这个查询。
  • 现在我这样称呼它grvNewRefGrid.DataSource = db.RefStatus.Where(g => g.Status == str).ToList();我如何在这里生成序列号,另外一个我生成序列号的原因是实体框架需要一个密钥才能正常工作,我将此列用作键。
猜你喜欢
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 2015-10-19
  • 2019-08-19
相关资源
最近更新 更多