2014-12-22 3 views
1

У меня есть .NET 4.5 код:Перечисляя над Linq результатов запроса

var result = db.storedProcedure(param) 
if (!result.Any()) { return; } 
foreach (var entry in result) 
{ 
    // Some code... 
} 

В настоящее foreach, исключение составляет бросок:

The query results cannot be enumerated more than once. 

Как я могу проверить, если result пуст? Я также пробовал if (result.Count() == 0), и это также вызывает то же исключение в цикле foreach. Я также пробовал foreach (var entry in result.ToList()), и это также вызывает одно и то же исключение.

Я пробовал следующие предложения here и here, не повезло.

Я также попытался:

var result = db.storedProcedure(param) 
if (!result.Any()) { return; } 
var resultList = result.ToList(); 
foreach (var entry in resultList) {} 

И я все еще получаю такое же исключение в этом foreach цикла, а также.

Должен быть какой-то способ легко проверить, нет ли набора результатов Linq пустым. Что я делаю не так?

+0

У вас есть код после 'foreach', который вы не хотите запускать, если нет записей? Если нет, то 'if (! Result.Any()) {return; } 'все равно ничего не делает. –

+0

Вы также получаете такое же исключение в этом последнем примере, даже если вы сначала не проверяете количество записей, а только пытаетесь перечислить результаты? –

+0

@BenRobinson: Да, это правильно. Я не включил этот код здесь, потому что я не думаю, что он имеет отношение к этому конкретному вопросу. – smoothgrips

ответ

6

Просто поместите результат в перечень до итерация:

var result = db.storedProcedure(param).ToList(); 
if (result.Count == 0) { return; } 
+0

Это работает, спасибо. Тем не менее, мне любопытно, почему существует метод Linq '.Any()', если все, что он делает, - это исключение. В чем смысл существующего метода, и как можно использовать его правильно, не создавая исключения? – smoothgrips

+0

@smoothgrips вы все равно можете использовать любой метод после ToList, проблема с вашим кодом: Any перечисляет результат перед foreach, и именно поэтому вы получаете исключение. обычно это не так, вы можете перечислить запрос столько раз, сколько захотите. но это только особый случай. –

+0

Sleman22 Я имел в виду, что быть в направлении 'smoothgrips' жаль, что я отредактирую – MethodMan

1

Почему вы даже сделать эту проверку на всех? Ваша петля вообще не запустится, если ничего нет в result. Просто имейте это:

var result = db.storedProcedure(param) 
foreach (var entry in result) 
{ 
    // Some code... 
} 

return; 
+0

Во многих случаях вы определенно верны. Однако существует код до и после цикла, который выполняется в зависимости от того, являются ли результаты пустыми или нет. Я не включил этот код, потому что он не имеет отношения к конкретному вопросу. – smoothgrips

Смежные вопросы