0

Can anybody explain why I don't see the (my) expected output for the WriteLine? I can see it when I'm debugging it in VS and refresh the 'result' to see its content in my Local window inside 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

4 回答 4

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

于 2013-03-20T14:17:27.657 回答
1

You need to do something with results in order for your lambda to exeucute. Try this:

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

As you enumerate over result your lambda will be called.

于 2013-03-20T14:16:53.250 回答
1

也许您需要具体化查询。Youresult是,因此委托仅在实际枚举IEnumerable时才会归档。result

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

于 2013-03-20T14:17:35.950 回答
0

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

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

调用它会调用评估。您可以在网上阅读有关此内容的信息,但这里有一篇文章可以开始。

于 2013-03-20T14:20:05.087 回答