2013-03-20 63 views
0

任何人都可以解釋爲什麼我沒有看到WriteLine的(我)預期的輸出? 我可以看到它,當我在VS中調試它並刷新'結果',以查看其VS內的本地窗口中的內容。 THXLINQ,Lambda,困惑

Func<Category, bool> del = (Category cat) => { 
    System.Console.WriteLine(cat.CategoryName); 
    return cat.CategoryID > 1; 
}; 


NorthwindEntities nw = new NorthwindEntities(); 

var result = nw.Categories.Where<Category>(del); 

Console.Read(); 
+1

嗨,歡迎來到StackOverflow,你可以發佈一些預期的輸入/輸出和你實際得到的? – 2013-03-20 14:13:27

+1

你期望看到輸出結果在哪裏?這是一個控制檯應用程序? – 2013-03-20 14:14:25

回答

1

你需要做results爲了什麼你lambda來exeucute。試試這個:

var result = nw.Categories.Where<Category>(del); 
foreach(var r in result) 
{ 
} 

當你枚舉result你的lambda將被調用。

5

LINQ結構是延遲評估的,這意味着您的lambda函數將不會被調用,直到從枚舉請求項目(並且即使這樣,不一定全部一次)。這應該引起值輸出到控制檯:

var result = nw.Categories.Where<Category>(del).ToList(); 

請注意這裏的含義:如果你這樣做,值將被輸出到控制檯兩次

var result = nw.Categories.Where<Category>(del); 
var otherVariable = result.ToList(); 
foreach(var item in result) 
{ 
    // do something 
} 

這爲什麼你應該避免在你的LINQ查詢中涉及帶有副作用的代碼是一個很好的理由。

1

也許你需要實現查詢。您resultIEnumerable,因此只有實際枚舉result時代理纔會進行文件。

試試這個:var result = nw.Categories.Where<Category>(del).ToList();

0

這是由於lazy evaluation。該功能實際上並沒有尚未執行,因此它不枚舉,直到您自己枚舉,或者你做這樣的事情:

Category[] categories = nw.Categories.Where<Category>(del).ToArray(); 

調用此將調用評價。你可以在網上閱讀這篇文章,但here是一篇文章。