具有分页和where子句的IdentityUser表的MVC SqlQuery

时间:2016-08-24 18:33:20

标签: entity-framework asp.net-mvc-5 claims-based-identity

我想查询我的网站用户...这些用户存储在AspNetUsers表中,并且有我的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();

我收到错误:“结果类型'System.Collections.Generic.IEnumerable`1 [OhansonsLib.OhansonsUser]'可能不是抽象的,必须包含默认构造函数。”

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

1 个答案:

答案 0 :(得分:1)

您必须直接传递模型类型,而不是您期望的集合类型。然后它尝试实例化该类型并基于该类型执行映射。因此,生成异常是因为接口不是具体类型,并且永远无法实例化。如果您查看文档,它将返回类型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();