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

如何在LinQ的IQueryable查询中添加序列号?

在IQueryable查询中生成基于记录数量的序列号

我来帮你搞定这个生成连续序列号的问题~你现在的方法里把SrNo固定设为0,想要改成按查询结果的顺序生成1、2、3...这样的序号对吧?下面分不同EF版本给你高效的解决方案,优先推荐在数据库端计算的方式,避免把大量数据拉到内存处理:

方案1:适用于EF Core(最推荐)

EF Core支持直接在LINQ查询中使用带索引的Select方法,它会被转换成数据库的ROW_NUMBER()函数,完全在数据库端计算序列号,性能拉满。注意必须指定排序字段,不然数据库返回的记录顺序不固定,序列号也会乱:

public IQueryable<CompanyModel> GetCompanyData()
{
    var query = Context.tblCompany
        .Where(e => e.Cmp_Id == this.CompanyId && e.TenantId == this.TenantId)
        .OrderBy(e => e.CmpId) // 这里换成你业务需要的排序字段,比如创建时间也可以
        .Select((e, index) => new CompanyModel()
        {
            CmpId = e.Cmp_Id,
            SrNo = index + 1 // index从0开始,加1就得到从1开始的序列号
        });
    return query;
}

方案2:适用于EF6

EF6本身不支持带索引的Select,所以我们可以用SqlFunctions.RowNumber()来生成行号,同样要搭配排序:

public IQueryable<CompanyModel> GetCompanyData()
{
    var query = Context.tblCompany
        .Where(e => e.Cmp_Id == this.CompanyId && e.TenantId == this.TenantId)
        .OrderBy(e => e.CmpId)
        .Select(e => new 
        {
            e.Cmp_Id,
            SrNo = SqlFunctions.RowNumber()
        })
        .Select(result => new CompanyModel()
        {
            CmpId = result.Cmp_Id,
            SrNo = result.SrNo
        });
    return query;
}

如果你的EF6版本不支持SqlFunctions.RowNumber(),也可以用原生SQL查询的方式:

public IQueryable<CompanyModel> GetCompanyData()
{
    var sql = @"SELECT Cmp_Id, ROW_NUMBER() OVER(ORDER BY Cmp_Id) AS SrNo
                FROM tblCompany
                WHERE Cmp_Id = @CompanyId AND TenantId = @TenantId";
    
    var parameters = new[]
    {
        new SqlParameter("@CompanyId", this.CompanyId),
        new SqlParameter("@TenantId", this.TenantId)
    };
    
    return Context.Database.SqlQuery<CompanyModel>(sql, parameters).AsQueryable();
}

备选方案:小数据量可以用内存生成

如果你的查询返回的数据量很小,也可以先把数据拉到内存再生成序列号,但这种方式不适合大数据量(会占用更多内存):

public IQueryable<CompanyModel> GetCompanyData()
{
    var list = Context.tblCompany
        .Where(e => e.Cmp_Id == this.CompanyId && e.TenantId == this.TenantId)
        .OrderBy(e => e.CmpId)
        .Select(e => new CompanyModel()
        {
            CmpId = e.Cmp_Id
        })
        .AsEnumerable() // 把数据拉到本地内存
        .Select((model, index) => 
        {
            model.SrNo = index + 1;
            return model;
        })
        .AsQueryable(); // 转回IQueryable以符合方法返回类型
    
    return list;
}

重要提醒

不管用哪种方案,一定要指定OrderBy排序字段!数据库不会保证默认的返回顺序,没有排序的话,每次查询的序列号可能都不一样哦。

内容的提问来源于stack exchange,提问作者Dilip Oganiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:43:35