2012-02-21 2 views
0

IQueryable<Car> cars이라고 말해보십시오.지연된 실행 값이 변경되지 않음

foreach (Car c in cars) 
{ 
    c.Doors = 2; 
} 

c.Doors 대신 변경된 값으로, foreach는 후 원래의 값을 포함 않습니다 내가 같은를 반복

?

당신은 된 IQueryable가 올바른 문이 아닌 개체 쿼리에 LINQ의 결과라고 지적 사전

+0

열거하기 전에 목록으로 변환하면 정확한 결과를 얻습니다. – Dante

+0

IQueryable 의 구현은 각 반복마다 새 집합을 생성하거나 Car.Doors의 설정자가 '중단됨'입니다. IQuerable 이 생성 된 곳을 알려주십시오. – Polity

+0

IQueryable 은 Linq to Entities 쿼리의 결과입니다. Linq 쿼리에서 값을 속성 Doors에 할당 할 수 있으므로 setter가 좋습니다. – Dante

답변

1

에 감사드립니다. MyDatabaseContext.Cars.Where (x => x.Name == "Test")는 IQueryable을 반환하고 데이터베이스에서 쿼리를 반복 수행합니다. (반복은 당신이 그것에 foreach를 수행 할 때이다). 따라서 아직 결과 세트가 포함되어 있지 않습니다.

자동차를 두 번 반복하면 데이터베이스에 2 개의 동일한 쿼리가 생성되고 2 개의 동일한 결과 집합이 반환됩니다. 데이터를 보존하려는 경우. ToArray 또는 ToList를 호출하거나 조작 후 필요하면 다시 반복하기 전에 변경 사항 저장을 수행하십시오.

+0

어쨌든 내 부분에서는 어색한 표현 이었지만 IQueryable만으로는 쿼리가 실행되지 않습니다. 따라서 반복 할 때 쿼리는 한 번 실행됩니다. 반복 후에 ToList()를 수행하면 쿼리가 다시 실행됩니다. 권리? – Dante

+0

ToList는 내부적으로 소스를 반복합니다. :) – Polity

1

IQueryable을 반복하면 데이터베이스에서 결과 세트를 가져옵니다. 알고 계시 겠지만. 이 상황과 다른 상황에서 관찰 한 것은이 결과가 캐시되지 않는다는 것입니다. 따라서 IQueryable을 반복하여 실제로 다시 쿼리가 실행되므로 수정 사항이 보존되지 않습니다. 그 코드에 의해 결코 영향을받지 않은 새로운 결과 세트.

ToList()을 먼저 호출하고 그 결과를 반복 할 때 그 이유는 ToList()이 전체 결과 집합을 검색하고 구체화하므로 더 이상 데이터베이스 내용에 연결되지 않으며 실제로는 데이터베이스가 반환되었습니다.

변경 사항이 적용되도록하는 유일한 방법은 데이터의 로컬 사본을 조작하는 것입니다. 즉, 데이터를 IQueryable 땅에서 들어 올리는 것입니다. 결과 집합의 IEnumerable (예 : ToEnumerable()의 결과)을 저장하면 열거 할 때마다 동일한 결과 집합이 반환되지만, ToList()과 달리 즉시 평가가 수행되지는 않습니다.

관련 문제