Я пытаюсь понять, что влияет на AsEnumerable()
на мои данные при итерации по нему. У меня есть список флеш-памяти. Если я foreach
над ним с первым вызовом ToList()
, эта оценка силы и моя распечатка выглядит следующим образом (см код в нижней части этого поста, чтобы объяснить выход):AsEnumerable и как он влияет на доходность и SqlDataReader
entering da
yield return
yield return
yield return
exiting da
doing something to aaron
doing something to jeremy
doing something to brendan
Все имеет смысл. ToList()
заставляет выходы в репозитории выполнять сначала в список, затем мы получаем нашу итерацию foreach
. Все хорошо до сих пор.
Когда я делаю то же самое, за исключением использования AsEnumerable()
, основываясь на том, что я прочитал о IQueryable
(я понимаю, что это не IQueryable
), я подумал бы эту оценку также силы, но это не так. Это выглядит следующим образом:
entering da
yield return
doing something to aaron
yield return
doing something to jeremy
yield return
doing something to brendan
exiting da
Как бы, если бы я даже не назвал AsEnumerable()
, поэтому мой вопрос:
Почему
AsEnumerable
ведут себя по-разному для в сборе памяти против LINQ к SQL и егоIQueryable
тип возврата?Как бы все это изменится, когда мое хранилище изменено с помощью
SqlDataReader
и делатьyield return
внутри считывателя (в то время вызоваRead()
метод). Будут ли полностью заполнены строки, исходящие из SqlServer, которые буферизуются в сетевом буфере клиентов, перед выполнениемforeach
(обычноyield
здесь приведет к «паузе» в репо, в то время как каждая строка обрабатывается блокомforeach
.Я знаю, звоню ли яToList()
первый в этом случае, я могу заставить оценкуSqlDataReader
, так жеAsEnumerable
сделать то же самое здесь
Примечания: Я не заинтересован в том сдача выхода в SqlDataReader
является хорошей идеей, поскольку это может держите соединение открытым, я уже избил эту тему до конца :)
Вот мой тестовый код:
public class TestClient
{
public void Execute()
{
var data = MockRepo.GetData();
foreach (var p in data.AsEnumerable()) //or .ToList()
{
Console.WriteLine("doing something to {0}", p.Name);
}
Console.ReadKey();
}
}
public class Person
{
public Person(string name)
{
Name = name;
}
public string Name { get; set; }
}
public class MockRepo
{
private static readonly List<Person> items = new List<Person>(3)
{
new Person("aaron"),
new Person("jeremy"),
new Person("brendan")
};
public static IEnumerable<Person> GetData()
{
Console.WriteLine("entering da");
var enumerator = items.GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine("yield return");
yield return enumerator.Current;
}
Console.WriteLine("exiting da");
}
}
Спасибо, queryable.where - enumerable.where различие, которое вы сделали, просто заставил все щелкнуть :) – AaronHS