2013-03-20 2 views
0

Может кто-нибудь объяснить, почему я не вижу (мой) ожидаемый выход для WriteLine? Я могу это увидеть, когда я отлаживаю его в VS и обновляю «результат», чтобы увидеть его содержимое в моем локальном окне внутри VS. THXLINQ, Lambda, confused

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, можете ли вы опубликовать некоторые ожидаемые входы/выходы и то, что вы на самом деле получаете? –

+1

Где вы ожидаете увидеть результат? Это консольное приложение? –

ответ

1

Вам нужно сделать что-то с results для того, чтобы ваша лямбда в exeucute. Попробуйте это:

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

Как вы перечислить через result вашего лямбда будет называться.

5

Структуры LINQ ленивы, что означает, что ваша лямбда-функция не будет вызываться, пока элементы не будут запрошены из перечисления (и даже тогда, не обязательно все сразу). Это должно привести значения для вывода на консоль:

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

Возможно, вам необходимо оформить запрос. Вы result - это IEnumerable, поэтому делегат будет зарегистрирован только тогда, когда на самом деле перечислены result.

Попробуйте это: var result = nw.Categories.Where<Category>(del).ToList();

0

Это связано с lazy evaluation. Функция фактически не была выполнена еще, так что это не пронумерован, пока вы не перечислить сами или сделать что-то вроде этого:

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

Вызов этого будет вызывать оценку. Вы можете прочитать об этом в Интернете, но here - статья, которая может отбросить все.