2013-02-26 18 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

相關問題