2013-05-19 52 views
1

我有一個過程,我在列表中標識行(unmatchedClient),然後調用一個單獨的方法刪除它們(pingtree.RemoveNodes)。這似乎有點冗長,我只需將屬性「DeleteFlag」的值設置爲true即可實現同樣的效果。但是,如何使用linq設置值?這可以完全通過linq完成嗎?

var unmatchedClient = pingtree.Nodes.Where(x => 
    _application.LoanAmount < x.Lender.MinLoanAmount || 
    _application.LoanAmount > x.Lender.MaxLoanAmount || 
    _application.LoanTerm < x.Lender.MinLoanTerm || 
    _application.LoanTerm > x.Lender.MaxLoanTerm) 
.Select(x => x.TreeNode) 
.ToList(); 

pingtree.RemoveNodes(unmatchedClient); 

在此先感謝。

+0

(http://stackoverflow.com/questions/16594544/assigning-values-inside-a-linq-select/16594770#16594770)選擇一個解決方案之前,請考慮答案的問題[一個LINQ選擇內部分配值?]你的問題 –

回答

6

是否這樣?

pingtree.Nodes.Where(x => 
     _application.LoanAmount < x.Lender.MinLoanAmount || 
     _application.LoanAmount > x.Lender.MaxLoanAmount || 
     _application.LoanTerm < x.Lender.MinLoanTerm || 
     _application.LoanTerm > x.Lender.MaxLoanTerm) 
     .Select(x => x.TreeNode) 
     .ToList() 
     .ForEach(n=> n.DeleteFlag = true); 
3

但我怎麼使用LINQ

您沒有設置值。期。

Linq是查詢語言和查詢正在閱讀。

有一些人濫用設置價值的後門。在你的情況下,它會看起來像:

pingtree.Nodes.Where(...) 
       .Select(n => { n.DeleteFlag = true; return n; } 

但這確實沒有完成。首先,因爲這是意外的。 Linq方法,包括Select,應該保持源集合不變。其次,由於延期執行,聲明本身並沒有做任何事情。您必須強制執行(例如通過ToList())才能生效。

也許這看起來很挑剔,但是當查詢變得更復雜時,它就成了一個重點。進行投影(Select)後跟濾波器(Where)並不罕見。您可能已決定在投影后進行過濾(其中n.Deleted == false)。

所以,你使用linq查詢對象,然後通過它們循環來做任何需要做的事情。 ToList().ForEach()是您可以用來做到這一點的方法之一。

側節點:後門,我表明使用LINQ到SQL或實體框架時會拋出異常。