【发布时间】:2021-09-27 18:28:02
【问题描述】:
提前感谢您花时间阅读此问题。
我的数据库中有一个视图,我们称之为 Members_VW
在我的 .net 5 API 中,我试图从带有搜索参数的视图中获取成员列表的分页响应。我还需要返回响应的总数,以便前端知道结果将在多少页中返回。
目前,Members_VW 是通过如下查询生成的:
select
col1, col2, col3
from
table1 1
inner join table2 2 on 1.key = 2.key
inner join tble3 3 on 3.key = 2.key
where
defaultcondition1 = '1'
and
defaultcondition2 = '2'
我参考了this 的答案并尝试使用 CTE,最终将我的观点改为使用这样的查询:
with cte1 as (
select
col1, col2, col3
from
table1 1
inner join table2 2 on 1.key = 2.key
inner join tble3 3 on 3.key = 2.key
where
defaultcondition1 = '1'
and
defaultcondition2 = '2')
cte2 as (
select count(*) over() from cte1 )
select
*
from
cte1, cte2
但这不起作用,因为它总是返回cte1 中的总行数,而没有应用任何过滤器。
于是,我继续尝试构造查询,返回应用条件后的总行数,发现这个查询有效:
select
col1, col2, col3, count(*) over()
from
table1 1
inner join table2 2 on 1.key = 2.key
inner join tble3 3 on 3.key = 2.key
where
defaultcondition1 = '1'
and
defaultcondition2 = '2'
目前,我正在尝试使用 EF Core 实现相同的查询,但正在努力实现。
我已尝试实施here 提供的解决方案,但正如其中一位 cmets 所建议的,不再允许此实施。
我试图避免使用原始查询的实现。有没有在不使用原始查询的情况下从count(*) over() 获取结果?
以下是我目前的实现:
IQueryable<MembersVW> membersQuery = _context.MembersVW;
membersQuery = membersQuery.Where(u => u.MemberId == memberid);
membersQuery = membersQuery.OrderBy(m => m.MemberId).Skip(page * size).Take(size);
当我这样做时:
membersQuery = membersQuery.Count()
我返回以下错误:
Error CS0029 Cannot implicitly convert type 'int' to 'System.Linq.IQueryable<PersonalPolicyAPI.Models.VwPersonalPolicyMember>'
再次感谢您阅读我的问题,感谢您提供的任何帮助。 ??????????
【问题讨论】:
-
如果您在此行之前运行计数查询会发生什么
membersQuery = membersQuery.OrderBy(m => m.MemberId).Skip(page * size).Take(size); -
@RoarS。没有计数,它可以工作,并返回所有结果。但这不是我需要的。我需要能够从查询中分页以优化查询响应时间。
-
用
int count= membersQuery.Count()代替membersQuery = membersQuery.Count()。
标签: c# .net-core entity-framework-core .net-5 ef-core-5.0