首页 > 解决方案 > C# - SQL - 将 rowsCount 动态添加到数据模型

问题描述

我有一个代码,我通过像这样转换表模型来进行 sql 查询:

string sql = string.Format("SELECT * FROM {0}...", tableName...);

接着:

IEnumerable<T> r = dbConn.Connection.Query<T>(sql...);

问题是如果我想获得总行数(当然我可以计算“r”但如果有一个 where 子句它是不可能的,因为我想要总计数)我必须在没有 where 的情况下进行另一个查询。所以我想删除第二个查询。我在 sql 查询中执行此操作以获取 rowsCount:

string sql = string.Format("SELECT *, count(*) over() rowsCount FROM {0}...", tableName...);

我可以使用此查询获取 rowsCount,但由于两个模型都没有 rowsCount 我无法访问它,对我应该如何做有什么建议吗?

编辑:第一个查询通过使用偏移量和限制进行分页过滤,所以我想要总计数而不是过滤查询的计数。我正在寻找是否有一种方法可以不使用两个单独的查询,并通过一个查询获得结果和 rowsCount。

标签: c#sqllinqdapper

解决方案


您将不得不执行 2 个 SQL 查询。

没有什么能阻止您在一个 SQL 块中运行它们或使用输出参数调用存储的过程。因此,您不必拨打 2 次电话,但至少需要 2 次查询。

https://www.sqlservertutorial.net/sql-server-stored-procedures/stored-procedure-output-parameters/

如果您担心总计数的性能,请确保您在该表中的最小列上有一个索引,并且它应该非常快。

下面的示例在一次调用中返回一个数据集和一个输出

DROP PROCEDURE IF EXISTS dbo.DataSetAndOutput
GO

CREATE PROCEDURE dbo.DataSetAndOutput
    @YourId BIGINT, 
    @CountRecords INT OUTPUT
AS
BEGIN 

    SELECT * FROM YourTable
    WHERE Id = @YourId

    SET @CountRecords = (SELECT COUNT(YourId) FROM YourTable)

END
GO

-- Test the output
DECLARE @ResultCount INT
EXEC dbo.DataSetAndOutput @YourId= 252452, @CountRecords = @ResultCount OUTPUT

SELECT @ResultCount AS TheCount

在此处输入图像描述


推荐阅读