2010-03-05 31 views
3

在我的MVC應用程序的服務層中,我試圖將linq轉換爲sql實體結果到我的業務模型實體中。我目前在嘗試下面的代碼:你可以回報IList <T>?

public IList<Project> GetAllProjects() 
    { 
     var results = from p in _context.Repository<DBMappings.project>() 
         select p; 

     foreach (DBMappings.project prj in results.ToList<DBMappings.project>()) 
      yield return CreateProjectEntityFromDBProject(prj); 

    } 

不幸的是,這似乎並沒有工作,我可以猜到的唯一的事情是,產量只有IEnumerable的工作。除了創建一個新列表,在foreach循環中添加項並返回列表之外,還有其他解決方案嗎?我需要使用IList,因爲使用返回列表的方法需要能夠執行列表方法,如.Sort()。

回答

7

,如果你想.Sort()你應該在你的方法中創建一個列表。使用yield可以節省一些內存 - 因爲結果不會作爲單個對象存儲。當您只想結果時,這很有用。但是如果你想將內存中需要它的東西整理成一個單獨的東西。

+0

+1對排序的意見.. – 2010-03-05 19:11:10

+0

這很有道理,謝謝:) – KallDrexx 2010-03-05 19:11:55

+0

讓我給你關於產量的一般建議。當你確定知道它對當前任務有用時使用它。如果你懷疑不要使用它。 :) – Andrey 2010-03-05 19:14:32

1

IList<T>描述的功能與IEnumerable<T>不兼容,至少就延遲加載而言。

能夠轉到特定索引a la IList<T>需要枚舉整個枚舉,至少達到指定的索引。

如果你不關心整個IEnumerable<T>的評價,那麼你就可以構建一個List<T>服用IEnumerable<T>作爲構造函數的參數,然後返回List<T>作爲IList<T>

2

的C#規範的第8.14(重點煤礦):

yield語句是在 迭代器塊使用的(第8.2節),以產生一個值 到枚舉器對象(§10.14。 4)或 迭代器的可枚舉對象(第10.14.5節)或指示迭代結束。

IList實現IEnumerable,但它沒有實現IEnumerator。

+0

啊,這解釋了我的困惑的一部分。我沒有意識到有一個IEnumerator,我認爲這只是IEnumable – KallDrexx 2010-03-05 19:24:48

2

你不能「偷懶回報」的列表,但看起來你可以得到你想要的東西有:

return results.Select(prj=>CreateProjectEntityFromDBProject(prj)).ToList(); 

或只是

var results = from p in _context.Repository<DBMappings.project>() 
        select CreateProjectEntityFromDBProject(p); 
return results.ToList(); 
+0

啊好主意!沒有意識到我可以做任何一個。 – KallDrexx 2010-03-05 19:34:49

+0

感謝Linq與普通C#的不同之處,很容易忘記它仍然是C#。 – JasonTrue 2010-03-05 21:09:13

相關問題