【问题标题】:c# MySql.Data.EntityFrameworkCore store procedure paginationc# MySql.Data.EntityFrameworkCore 存储过程分页
【发布时间】:2020-09-03 11:57:16
【问题描述】:

为了在我使用 sql server (tsql) 之前在复杂查询中使用分页,我可以在任何复杂查询中使用 COUNT(*) OVER() as TotalCount 非常轻松地做到这一点,它将返回总计数和我可以在分页中使用它,但在 mysql 中它不起作用

用asp.net core连接mysql有两个包

  • MySql.Data.EntityFrameworkCore
  • Pomelo.EntityFrameworkCore.MySql

我都使用了,但我不知道如何在存储过程中实现分页并使用 FromSqlRaw 返回问题是返回行数 OUT TotalCount INT 我无法得到它

    DELIMITER $$
CREATE PROCEDURE get_articles(IN _offset INT, IN _count INT, OUT _total INT)
BEGIN
SELECT SQL_CALC_FOUND_ROWS * 
FROM content c JOIN content_types t 
ON c.content_type = t.id
WHERE t.name = 'article' 
LIMIT _offset, _count;
SET _total = FOUND_ROWS();
END$$
DELIMITER ;

c# 与 MySql.Data.EntityFrameworkCore

var result = await dbContext.Result.FromSqlRaw("CALL get_articles (0,30,@TotalCount)",totalCount
).AsNoTracking().ToListAsync();

这里是SQLFiddle演示

【问题讨论】:

    标签: c# mysql asp.net-core ef-core-3.1


    【解决方案1】:

    您的程序应该接受第一个元素或页码,然后您可以在 SQL 中组合限制关键字。例如限制 kpagecountpagenumber , kpagecount(pagenumber+1)-1 还有一个版本需要limit n offset m

    编辑后: 请在您的调用中包含参数 (C#)。

    【讨论】:

    • 我可以很容易地使用 sql server (tsql) (COUNT(*) OVER() as TotalCount) 它会在任何复杂查询中返回总计数,但我不能在 mysql 中做同样的事情
    • 所以试试 mysql 的 RANK () OVER() ( PARTITION BY /ORDER BY) ,也可以使用 cte 表达式。返回整个数据集,然后使用 linq 到对象。
    • RANK () OVER() ( PARTITION BY /ORDER BY) 不起作用(COUNT(*) OVER() as TotalCount)它将返回总行数而不是行数
    • 我经常使用的另一种方式(排名并不总是有用)是 CTE(或视图),其中上部有原始数据和一些排名列,它们是主查询中 GROUP BY 的来源。
    猜你喜欢
    • 2021-01-13
    • 2013-06-29
    • 2021-03-13
    • 1970-01-01
    • 2013-07-22
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多