2013-02-26 121 views
1

我有一个包含Supplier数据的列表,我希望通过使用SupplierID(非活动供应商并且只有1个最新结果)来搜索它。Lambda表达式用条件搜索并返回1个最新结果

所以我有:

List<Supplier> filteredList = this.toList();  
filteredList.OrderByDescending(m => m.ModifiedDatetime).FirstOrDefault();  
filteredList.Where(f => (f.Active == false && f.FieldId == SupplierFieldID)) 
      .ToList<Supplier>(); 

但我不能做这项工作;请帮忙。

回答

4

你需要你的链条LINQ表达式,如下所示:

var filteredList = unfilteredData 
    .Where(f => f.Active == false && f.FieldId == SupplierFieldID) 
    .OrderByDescending(m => m.ModifiedDatetime) 
    .FirstOrDefault(); 

您不需要ToList(),因为你需要一个单一的项目,而不是一个列表;这是FirstOrDefault()所做的。如果您需要最后一件商品,则需要按照原订购条件的相反顺序进行订购。例如,如果您想要最近修改日期的条目,则需要按降序排列(如您所做的那样)。

+1

您可以将lambda传递给FirstOrDefault的调用,然后摆脱此处的Where。 'unfilteredData.OrderByDescending(m => m.ModifiedDatetime).FirstOrDefault(f => f.Active == false && f.FieldId == SupplierFieldID);' – 2013-02-26 02:17:03

+2

@PrestonGuillot正确的,除了在这种情况下整个列表需要订购。假设过滤显着减少了条目的数量,出于性能原因可能需要单独的“Where”。 – dasblinkenlight 2013-02-26 02:19:00

+0

我会考虑过早的优化,个人,并希望有一个选择器与过滤条件的可读性,但我的评论是无论如何nit选择。 – 2013-02-26 02:24:12

1

您可以在一个声明中这样做,链接的LINQ运营商一起:

var filteredList = myList.Where(f => f.Active == false && f.FieldId == SupplierFieldID) 
         .OrderByDescending(m => m.ModifiedDatetime) 
         .Take(1); 

或@Preston GUILLOT建议,在更短的形式:

var filteredList = unfilteredData 
      .OrderByDescending(m => m.ModifiedDatetime) 
      .FirstOrDefault(f => f.Active == false && f.FieldId == SupplierFieldID); 
+0

嗨米奇,非常感谢您的好意。如果我想在函数中使用你的代码,我应该用什么样的数据类型来返回结果? – EngLoon 2013-02-26 02:33:21

+0

无论你列出的数据类型是 – 2013-02-26 02:35:28

+0

非常感谢Mitch。我还是新手,需要更多时间才能使用Lambda表达式...... :) – EngLoon 2013-02-26 02:45:19