2013-03-20 126 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是一篇文章。