IEnumerable<T>
- это запрос, а не коллекция. Хотя на другом конце есть какая-то коллекция, сам запрос не является коллекцией . Характер целевой коллекции будет определять, можете ли вы изменить содержимое.
Общее практическое правило заключается в том, что вы не можете ожидать, что IEnumerable<T>
будет возвращать один и тот же список объектов дважды, или даже ожидать, что вы сможете перечислять его несколько раз - это совершенно верно (если необычно) для IEnumerable<T>
для перечисления только один раз и отказа от перечисления во второй или третий раз.
В этом случае у вас фактически есть запрос к базе данных типа IQueryable<Model>
, который приводится к IEnumerable<Model>
. Это по-прежнему IQueryable<Model>
, что означает, что каждый раз, когда вы перечисляете его, вы получите (возможно) один и тот же список данных, но в совершенно новых объектах. Изменение одного из объектов не изменит все объекты для одной и той же исходной записи, а также не изменит содержимое самой базовой записи.
Если вы пытаетесь изменить возвращенные объекты без изменения базовых записей (кажется, это так), то вам нужно материализовать запрос в коллекцию в памяти. Есть несколько способов сделать это в зависимости от того, что вы ожидаете сделать с возвращенными данными.
Самое простое - преобразовать запрос в массив, используя метод расширения .ToArray()
:
public Model[] ListDaftarPjsp()
{
var query = from x in db.PJSPEvaluation
select new Model
{
foo = x.Foo,
bar = x.Bar
};
var list = query.ToArray();
foreach (Model item in list)
{
item.condition = "example";
}
return list;
}
Теперь записи находятся в массиве в памяти, и перечисление этого массива может быть выполнено несколько раз, возвращая одни и те же точные объекты, вместо того, чтобы каждый раз получать новые копии данных из базы данных.