我想查询我的网站用户...这些用户存储在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]'可能不是抽象的,必须包含默认构造函数。”
注意:它有一个默认构造函数。
答案 0 :(得分:1)
您必须直接传递模型类型,而不是您期望的集合类型。然后它尝试实例化该类型并基于该类型执行映射。因此,生成异常是因为接口不是具体类型,并且永远无法实例化。如果您查看文档,它将返回类型DbRawSqlQuery<TElement>
,它本身实现IEnumerable<TElement>
。
顺便说一下,您还可以使用Skip
和Take
使用Lambdas直接实现分页。示例(假设DbContext上的DbSet名为Users
)。
int pageSize = 20, pageIndex = 0;
var users = OhansonsDbContext.Users.OrderBy(user => user.Id).Skip(pageSize * pageIndex).Take(pageSize).ToList();