LINQ,Lambda,困惑

时间:2013-03-20 14:12:22

标签: c# linq lambda

有人可以解释为什么我没有看到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();

4 个答案:

答案 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)

也许您需要实现查询。您resultIEnumerable,因此代表只会在实际枚举result时提交。

试试这个:var result = nw.Categories.Where<Category>(del).ToList();

答案 3 :(得分:0)

这是由于lazy evaluation。该函数尚未实际执行,因此在您自己枚举或执行以下操作之前,不会枚举该函数:

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

调用此方法将调用评估。您可以在网上阅读此内容,但here是一篇可以解决问题的文章。