LINQ, Lambda, confused

本文关键字:confused Lambda LINQ | 更新日期: 2023-09-27 18:04:57

谁能解释为什么我没有看到(我)预期的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();

LINQ, Lambda, confused

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查询中涉及有副作用的代码的一个很好的理由。

为了让lambda执行,您需要对results做一些事情。试试这个:

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

当您枚举result时,您的lambda将被调用。

也许您需要具体化查询。您的resultIEnumerable,因此只有当实际枚举result时,委托才会提交文件。

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

这是由于lazy evaluation。这个函数实际上还没有被执行,所以它不会被枚举,除非你自己枚举它,或者你这样做:

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

调用this将调用计算。你可以在网上读到这方面的内容,但这里有一篇文章可以作为开始。