有人可以解释为什么我没有看到WriteLine的(我的)预期输出吗? 当我在VS中调试它并刷新'结果'以在VS内的本地窗口中查看其内容时,我可以看到它。 THX
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();
答案 0 :(得分: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 :(得分:1)
您需要对results
执行某些操作才能执行lambda。试试这个:
var result = nw.Categories.Where<Category>(del);
foreach(var r in result)
{
}
当您枚举result
时,您的lambda将被调用。
答案 2 :(得分:1)
也许您需要实现查询。您result
是IEnumerable
,因此代表只会在实际枚举result
时提交。
试试这个:var result = nw.Categories.Where<Category>(del).ToList();
答案 3 :(得分:0)
这是由于lazy evaluation
。该函数尚未实际执行,因此在您自己枚举或执行以下操作之前,不会枚举该函数:
Category[] categories = nw.Categories.Where<Category>(del).ToArray();
调用此方法将调用评估。您可以在网上阅读此内容,但here是一篇可以解决问题的文章。