【问题标题】:Conversion between IEnumerable to IList (Dapper return result)IEnumerable 到 IList 之间的转换(Dapper 返回结果)
【发布时间】:2014-02-08 13:38:35
【问题描述】:

UserManager方法的签名(ASP .NET Identity Core默认实现):

public Task<IList<string>> GetRolesAsync(User user) {
    const string query = @"
                select r.[Name]
                  from [UserRoles] ur
             left join [Roles] r on r.RoleId = ur.RoleId
                 where ur.UserId = @userId;
    ";

    return Task.Factory.StartNew(() => {
        using (SqlConnection connection = new SqlConnection(_connectionString))
            return connection.Query<string>(query, new { userId = user.UserId });
    });
}

但不幸的是Dapper.Query&lt;T&gt;返回IEnumerable&lt;T&gt;

是否可以返回IList&lt;T&gt; 或者我必须自己进行转换?

【问题讨论】:

    标签: c# .net asp.net-mvc dapper


    【解决方案1】:

    Dapper 只保证给你一个IEnumerable&lt;T&gt;。所以你应该只假设。特别是,它已经有不同的场景,它可以为您提供或者填充列表,延迟迭代器。

    最简单的方法是调用.ToList()。如果您打算避免分配,则可以进行推测测试:

    static IList<T> SpeculativeToList<T>(this IEnumerable<T> source)
    {
        return source as IList<T> ?? source.ToList();
    }
    

    【讨论】:

      【解决方案2】:

      只需拨打.ToList()就可以了吗?

      return connection.Query<string>(query, new { userId = user.UserId }).ToList();
      

      这将枚举IEnumerable&lt;T&gt; 并创建一个内存中的所有元素的副本,作为List&lt;T&gt;

      【讨论】:

      • 无法将类型 'List>' 隐式转换为 'IList>'
      • @FSou1:你确定这是错误的程度和整体问题吗? List&lt;string&gt; 可以隐式转换为 IList&lt;string&gt;。例如,这有效:IList&lt;string&gt; Test() { return new List&lt;string&gt;(); }
      • 是的,正如我在错误列表和任何操作中看到的那样。隐式转换按预期正确工作。
      【解决方案3】:

      尝试使用显式演员表

      return (IList<string>)connection.Query<string>(query, new { userId = user.UserId });
      

      【讨论】:

      • @FSou1 我是主要作者之一,我不同意 ;)
      • 无法保证您的演员阵容始终有效。这很容易引发异常。 ToList 更安全。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      相关资源
      最近更新 更多