2014-02-08 17 views
2

UserManager方法(ASP .NET身份核心默認實現)的簽名:轉換爲IList的(小巧精緻的返回結果)

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 }); 
    }); 
} 

但不幸的是​​回報IEnumerable<T>

是否可以返回IList<T>或者我必須自己進行轉換?

回答

-3

嘗試使用明確

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

這是正確的答案。 – FSou1

+3

@ FSou1我是主要作者之一,我不同意;) –

+0

無法保證您的演員將始終工作。這很容易引發異常。 ToList更安全。 – Shire

2

只需撥打.ToList()就可以了嗎?

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

這將枚舉IEnumerable<T>創造發現爲List<T>所有元素的內存副本。

+0

:你確定這是錯誤的程度和整體問題? 'List '可以隱式轉換爲'IList '。例如,這可以工作:'IList Test(){return new List (); }' – FSou1

+1

@ FSou1

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

+0

是的,因爲我可以在我的錯誤列表和任何操作中看到。按照預期,Implicity convert工作正確。 – FSou1

13

小巧玲瓏既能保證交給你的IEnumerable<T>。所以你應該只是假設。特別是,它已經有了不同的場景,它可以爲您提供或者填充列表,延期迭代器。

最簡單的方法是撥打.ToList()。如果你是避免了ALLOC意圖,那麼也許做投機測試:

無法隱式轉換類型「列表 >」到「的IList >」