2012-02-18 78 views
2

我有以下類別:如何使用LINQ來過濾和排序從一個集合到另一個集合?

public class Menu 
{ 
    public int Order { get; set; } 
    public string Title { get; set; } 
    public string Status { get; set; } 
    public string Type { get; set; } 
    public bool Default { get; set; } 
    public string Link { get; set; } 
    public string Notes { get; set; } 
    public string Text { get; set; } 
} 

public class MenuItem 
{ 
    public int Order { get; set; } 
    public string Title { get; set; } 
    public string Type { get; set; } 
    public bool Default { get; set; } 
    public string Link { get; set; } 
} 

而且這個返回的ICollection

var menu = _menuRepository.GetPk(pk); 

可有人告訴我,我該如何使用LINQ到:

a) Get the data from menu 
b) Select only rows where Status = "00" 
c) Order by Order 
d) Put the data into the MenuItem class 

聽說有可能兩種編碼方式。任何人都可以解釋這些,並建議哪個更好。

回答

5

試試這個:

var menuItems = _menuRepository.GetPk(pk) 
    .Where(m => m.Status == "00") 
    .OrderBy(m => m.Order) 
    .Select(m => new MenuItem 
       { 
        Order = m.Order, 
        Title = m.Title, 
        Type = m.Type, 
        Default = m.Default, 
        Link = m.Link 
       }); 

您可以在年底拋出.ToList()立即兌現集合。

6

吉米的答案看起來我的權利 - 這裏的查詢表達式的形式相當於:

var query = from m in _menuRepoistory.GetPk(pk) 
      where m.Status == "" 
      order by m.Order 
      select new MenuItem 
      { 
       Order = m.Order, Title = m.Title, Type = m.Type, 
       Default = m.Default, Link = m.Link 
      }; 

您可能要考慮增加一個MenuItem構造,這需要MenuToMenuItem方法Menu,所以你可以只需使用:

var query = from m in _menuRepoistory.GetPk(pk) 
      where m.Status == "" 
      order by m.Order 
      select m.ToMenuItem(); 

(與吉米的回答,您可以撥打ToList兌現在List<T>的結果。)

+0

或者創建一個擴展方法來做到這一點:) – jessehouwing 2012-02-20 20:11:37

+0

@jessehouwing:我不會這樣做 - 它看起來太具體,不值得擴展方法,真的。 – 2012-02-20 20:42:11

+0

同意,儘管過去當MenuItem或存儲庫由於進程或其他限制而成立時,我已經完成了它。它仍然擊敗了轉換操作符...雖然當然也有一個簡單的靜態幫助器方法。 – jessehouwing 2012-02-20 21:42:45

相關問題