【问题标题】:.NET Dapper range.NET Dapper 范围
【发布时间】:2014-01-13 14:19:46
【问题描述】:

我最近一直在为我的 API 运行 Dapper 扩展库。以下代码根据单个用户 ID 返回用户列表及其相应地址:

 public User GetUserBicProfiles(string userId)
    {

        using (
            var multipleResults = this.db.QueryMultiple("sp_UserPermisisons", new {userId = 
           userId},commandType: CommandType.StoredProcedure))
         {
            var user = multipleResults.Read<User>().SingleOrDefault();

            var permissions= multipleResults.Read<Permissions>().ToList();

            if (user != null&& permissions != null)
            {
               user.Permissions.AddRange(permissions);
            }

            return user;
        }
    }

这很好用,但是当我尝试使用相同的详细信息集,但没有 userId 作为参数(应该返回具有各自权限的所有用户)时,我收到与添加范围有关的错误。

System.Collections.Generic.List' 不包含“UserPermissions”的定义,并且找不到接受“System.Collections.Generic.List”类型的第一个参数的扩展方法“UserPermissions”(您是否缺少使用指令还是程序集引用?)

全部返回的方法是:

public List<User> GetUsers()
    {
        using (var multipleResults = this.db.QueryMultiple("sp_UserPermissions",commandType: CommandType.StoredProcedure))
        {
            var user = multipleResults.Read<User>().ToList();

            var permissions = multipleResults.Read<Permissions>().ToList();

            if (user != null && permissions != null)
            {

                user.Permissions.AddRange(permissions);
            }

            return user;
        }
    }

用户类是:

public class User
{
    public User()
    {
        this.Permissions = new List<Permissions>();
    }
    public string UserId { get; set; }
    public string UserName { get; set; }
    public string ApplicationName { get; set; }
    public string Email { get; set; }
    public string Comment { get; set; }
    public string Password { get; set; }
    public string PasswordQuestion { get; set; }
    public string PasswordAnswer { get; set; }
    public bool? IsApproved { get; set; }
    public DateTime LastActivityDate { get; set; }
    public DateTime LastLoginDate { get; set; }
    public DateTime LastPasswordChangeDate { get; set; }
    public DateTime CreationDate { get; set; }
    public bool? IsOnline { get; set; }
    public bool? IsLockedOut { get; set; }
    public DateTime LastLockedOutDate { get; set; }
    public bool? FailedPasswordAttempCount { get; set; }
    public DateTime FailedPasswordAttemptWithStart { get; set; }
    public bool? FailedPasswordAnswerAttemptCount { get; set; }
    public DateTime FailedPasswordAnsdwerAttemptWindowStart { get; set; }


    public List<Permissions> Permissions { get; set; } 
}

【问题讨论】:

  • 如果没有传入userId,你确定存储过程会返回吗?
  • 没有名为UserPermissions 的类成员,如何存在名为Permissions 的类mbr
  • 更正UserPermissions,应该是Permissions。
  • 克里斯,如果我注释掉它试图添加范围的行并进行调试,我会看到从 SQL 返回的权限列表 - 在 SQL 中执行存储的过程,无论是否有参数都有效

标签: c# orm dapper


【解决方案1】:

该错误是因为您试图访问 List&lt;User&gt; 对象上的 Permissions 对象,该对象既不作为属性存在,也不作为扩展方法存在。

在您的第一个示例中,变量 user 的类型为 User,您使用 SingleOrDefault() 方法返回单个 User 对象。

...
var user = multipleResults.Read<User>().SingleOrDefault();

var permissions= multipleResults.Read<Permissions>().ToList();
if (user != null&& permissions != null)
{
  user.Permissions.AddRange(permissions);
}

return user; // --> user type is User
...

虽然在第二个示例中,变量 user 的类型为 List&lt;User&gt;,但您使用 ToList() 方法返回了 User 对象 (List&lt;User&gt;) 的列表。

...
var user = multipleResults.Read<User>().ToList();
var permissions = multipleResults.Read<Permissions>().ToList();

if (user != null && permissions != null)
{
  user.Permissions.AddRange(permissions);
}

return user; // --> user type is List<User>
...

【讨论】:

  • 好的,我明白你现在的建议了。那么,我需要添加内联类的新实例吗?列表等
  • 是的,你是对的。问题不在于返回的类型(UserList&lt;User&gt; 都可以)。问题是Permissions 属于 A User(每个用户都应该有自己的权限列表)而不是User 的列表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
相关资源
最近更新 更多