2012-02-18 111 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

相关问题