2013-07-27 20 views
0

我有以下幾點:我如何在C#中投一個IEnumerable爲IList

public IList<TopicSubTopic> GetTopicSubTopics(int topicId) 
{ 
    var topicSubTopics = _subTopicsRepository 
        .GetAll() 
        .Where(s => s.TopicId == topicId) 
        .Include(s => s.Topic) 
        .ToList(); 

    var topicSubTopicsSelect = from item in topicSubTopics.AsEnumerable() 
     select new TopicSubTopic(
      item.TopicId, 
      item.SubTopicId, 
      item.Topic.Name, 
      item.Name); 

    return topicSubTopicsSelect; 
} 

和:

public partial class TopicSubTopic 
{ 
    public TopicSubTopic(int topicId, int subTopicId, string topicName, string subTopicName) 
    { 
     TopicId = topicId; 
     SubTopicId = subTopicId; 
     TopicName = topicName; 
     SubTopicName = subTopicName; 
    } 
    public int TopicId { get; set; } 
    public int SubTopicId { get; set; } 
    public string TopicName { get; set; } 
    public string SubTopicName { get; set; } 
} 

我的IDE是給我下面的消息:

Error 3 Cannot implicitly convert type 
'System.Collections.Generic.IEnumerable<Models.Views.TopicSubTopic>' to 
'System.Collections.Generic.IList<Models.Views.TopicSubTopic>'. 
An explicit conversion exists (are you missing a cast?) 

回答

4

你不能在這種情況下 - 查詢返回的對象不會IList<T>,所以一個演員會失敗。

最簡單的解決方法是,只爲了呼喚Enumerable.ToList,將從它創建一個List<T>

return topicSubTopicsSelect.ToList(); 

順便說一句,您的通話AsEnumerable()是毫無意義因爲你已經叫在前面的查詢ToList(雖然你可以使用AsEnumerable()ToList()代替 - 你不需要兩個單獨的查詢反正我會用:

return _subTopicsRepository 
       .GetAll() 
       .Where(s => s.TopicId == topicId) 
       .Include(s => s.Topic) 
       .AsEnumerable() 
       .Select(item => new TopicSubTopic(item.TopicId, 
                item.SubTopicId, 
                item.Topic.Name, 
                item.Name)) 
       .ToList(); 
+0

謝謝你的完美答案。一如既往 ! – Melina

+0

您也可以在投影后進行AsEnumerable調用。 – NunoCarmo

+0

@NoCarmo:我只是在將它改爲使用無參數的構造函數和屬性後才懷疑。那時,「AsEnumerable」將完全沒有意義。 –

相關問題