.NET Dapper 范围

Posted

技术标签:

【中文标题】.NET Dapper 范围【英文标题】:.NET Dapper range 【发布时间】: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 中执行存储的过程,无论是否有参数都有效 【参考方案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 的列表。

以上是关于.NET Dapper 范围的主要内容,如果未能解决你的问题,请参考以下文章

.NET轻量级ORM框架Dapper入门精通

小巧玲珑和交易范围?

MyDAL - 组件适用范围说明

轻量级ORM框架 Dapper快速学习

Dapper.NET——轻量ORM

dapper.net 转载