Объявите переменную IEnumerable <T>для последующего использования - PullRequest
2 голосов
/ 10 ноября 2011

У меня есть запрос LINQ, такой как:

using(csv.......)
{
    csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) });
}
//Do some stuff

//Now I want to use the result of the query
foreach(var item in ??)
{

}

Запрос возвращает IEnumerable в моем операторе using, но как мне объявить, а затем назначить переменную, чтобы я мог использовать ее позже в foreach заявление?

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Тип запроса IEnumerable<Data>, который вы можете объявить вне блока using. Тем не менее, из комментариев очевидно, что вы не можете перечислить после удаления myObject. Если вы не хотите вытягивать все элементы в список перед выходом из блока using, единственный вариант - выполнить перечисление внутри блока using. Для извлечения данных из базы данных требуется открытое соединение с этой базой данных и т. Д.

using(myObject.......) 
{ 
  var query = csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) }); 
  //Do some stuff 

  //Now I want to use the result of the query
  foreach (var item in query)
    ...
} 
3 голосов
/ 10 ноября 2011

Вы должны хорошо воспользоваться IEnumerable. Прелесть этого в том, что ваш запрос не оценивается, пока вам не понадобится. Как только вы сделаете ToList(), ваш запрос будет выполнен полностью. Рекомендуется использовать IEnumerable как можно больше.

Вы можете просто определить IEnumerable<Data> во внешней области видимости, как это

IEnumerable<Data> myDataList;
using(myObject.......)
{
    myDataList =csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) });
}
// do your stuffs
// and just use the IEnumerable<Data> in your foreach loop
foreach(var item in myDataList)
{
    // here item is typeof(Data)
}
2 голосов
/ 10 ноября 2011

Объявите переменную вне блока использования.

Вызовите ToList() или ToArray() для выполнения запроса.

List<Data> data=null;
using(myObject.......)
{
    data=csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) }).ToList();
}

Если возможно выполнить запрос после возврата из условия using, вы можете сделать:

IEnumerable<Data> data=null;
using(myObject.......)
{
    data=csv.Select(x => new Data() { ID = x[27], Raw = String.Join(",", x) });
}

Но если это так, почему вы помещаете это в предложение using в первую очередь?

Если запрос зависит от того, не * распоряжается * 1015, у вас есть два варианта:

  • Используйте ToList() для немедленного выполнения запроса и загрузки его в память.
  • распоряжаться myObject позже.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...