如何在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
相关产品推荐
相关产品推荐

