IQueryable<Car> cars
이라고 말해보십시오.지연된 실행 값이 변경되지 않음
foreach (Car c in cars)
{
c.Doors = 2;
}
왜 c.Doors
대신 변경된 값으로, foreach는 후 원래의 값을 포함 않습니다 내가 같은를 반복
?
당신은 된 IQueryable가 올바른 문이 아닌 개체 쿼리에 LINQ의 결과라고 지적 사전IQueryable<Car> cars
이라고 말해보십시오.지연된 실행 값이 변경되지 않음
foreach (Car c in cars)
{
c.Doors = 2;
}
왜 c.Doors
대신 변경된 값으로, foreach는 후 원래의 값을 포함 않습니다 내가 같은를 반복
?
당신은 된 IQueryable가 올바른 문이 아닌 개체 쿼리에 LINQ의 결과라고 지적 사전에 감사드립니다. MyDatabaseContext.Cars.Where (x => x.Name == "Test")는 IQueryable을 반환하고 데이터베이스에서 쿼리를 반복 수행합니다. (반복은 당신이 그것에 foreach를 수행 할 때이다). 따라서 아직 결과 세트가 포함되어 있지 않습니다.
자동차를 두 번 반복하면 데이터베이스에 2 개의 동일한 쿼리가 생성되고 2 개의 동일한 결과 집합이 반환됩니다. 데이터를 보존하려는 경우. ToArray 또는 ToList를 호출하거나 조작 후 필요하면 다시 반복하기 전에 변경 사항 저장을 수행하십시오.
IQueryable
을 반복하면 데이터베이스에서 결과 세트를 가져옵니다. 알고 계시 겠지만. 이 상황과 다른 상황에서 관찰 한 것은이 결과가 캐시되지 않는다는 것입니다. 따라서 IQueryable
을 반복하여 실제로 다시 쿼리가 실행되므로 수정 사항이 보존되지 않습니다. 그 코드에 의해 결코 영향을받지 않은 새로운 결과 세트.
ToList()
을 먼저 호출하고 그 결과를 반복 할 때 그 이유는 ToList()
이 전체 결과 집합을 검색하고 구체화하므로 더 이상 데이터베이스 내용에 연결되지 않으며 실제로는 데이터베이스가 반환되었습니다.
변경 사항이 적용되도록하는 유일한 방법은 데이터의 로컬 사본을 조작하는 것입니다. 즉, 데이터를 IQueryable
땅에서 들어 올리는 것입니다. 결과 집합의 IEnumerable
(예 : ToEnumerable()
의 결과)을 저장하면 열거 할 때마다 동일한 결과 집합이 반환되지만, ToList()
과 달리 즉시 평가가 수행되지는 않습니다.
열거하기 전에 목록으로 변환하면 정확한 결과를 얻습니다. – Dante
IQueryable의 구현은 각 반복마다 새 집합을 생성하거나 Car.Doors의 설정자가 '중단됨'입니다. IQuerable 이 생성 된 곳을 알려주십시오. –
Polity
IQueryable은 Linq to Entities 쿼리의 결과입니다. Linq 쿼리에서 값을 속성 Doors에 할당 할 수 있으므로 setter가 좋습니다. –
Dante