带有分页和 where 子句的 IdentityUser table 的 MVC SqlQuery

MVC SqlQuery of IdentityUser table with paging and where clause

我想查询我网站的用户...这些存储在 AspNetUsers table 中,并且有额外的字段,如我的 OhansonsUser 对象中所定义的,该对象继承自 IdentityUser,如下所示:

public class OhansonsUser : IdentityUser<long, CustomUserLogin, CustomUserRole, CustomUserClaim>
{ 
....
}

我正在尝试进行以下查询:

        var sql = @"
SELECT  *
 FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY Id ) AS RowNum, *
        FROM      AspNetUsers
        WHERE     Id > 2
      ) AS RowConstrainedResult
WHERE   RowNum >= 1
  AND RowNum < 20
ORDER BY RowNum
";
        var users = Global.OhansonsDbContext.Database.SqlQuery<IEnumerable<OhansonsUser>>(sql).ToList();

我收到错误:"The result type 'System.Collections.Generic.IEnumerable`1[OhansonsLib.OhansonsUser]' may not be abstract and must include a default constructor."

注意:它确实有一个默认构造函数。

您必须直接传递模型类型,而不是您期望的集合类型。然后它会尝试实例化该类型并执行基于该类型的映射。所以产生异常是因为接口不是具体类型并且永远无法实例化。如果您查看文档,它将 return 类型 DbRawSqlQuery<TElement> 本身实现 IEnumerable<TElement>.

顺便说一下,您还可以使用 SkipTake 直接使用 Lambdas 实现分页。示例(假设 DbContext 上的 DbSet 名为 Users)。

int pageSize = 20, pageIndex = 0;
var users = OhansonsDbContext.Users.OrderBy(user => user.Id).Skip(pageSize * pageIndex).Take(pageSize).ToList();