0

다음 방법은 내 서비스 계층에서 제대로 작동합니다.사용 EF 코드 먼저 지역의 확장자는

public override IList<City> GetAll(Func<City, bool> predicate) 
     { 
      var query = from item in _tEntities 
         select item; 
      query.Where<City>(predicate); 
      query.Load(); 
      return _tEntities.Local; 
     } 

무엇이 문제이며 어떻게 해결할 수 있습니까?
이 샘플에서는 로컬 메서드를 사용하고 새 데이터를 로컬 (캐시)에 다시로드 할 수 있습니까?

+0

그냥'return query;'가 아니십니까? –

답변

0

여기에 .Load 메서드를 사용하여 달성하려는 작업이 너무 명확하지 않지만 다음과 같은 작업이 필요하다고 생각됩니다.

public override IList<City> GetAll(Func<City, bool> predicate) 
{ 
    return _tEntities.Where<City>(predicate).ToList(); 
} 
1

잘못된 문제를보고 있습니다. 가장 많이 볼 수있는 것은 첫 번째 쿼리를 수행 할 때 로컬 캐시가 비어 있다는 사실입니다. 따라서 쿼리에서 결과 만 반환합니다. 하지만 두 번째 작업을 수행하면 첫 번째 쿼리의 결과와 두 번째 쿼리가 반환됩니다.

이것은 모든 메서드간에 공유 DbContext를 사용한다는 사실에 달려 있습니다. 로컬은 가장 최근의 쿼리뿐만 아니라 컨텍스트가 검색 한 모든 레코드의 캐시를 포함합니다.

올바른 해결 방법은이 방식으로 로컬을 사용하지 않는 것입니다. 컨텍스트 캐시가 부풀어 오르기 때문에 공유 컨텍스트를 사용하지 마십시오.

0
query.Where<City>(predicate); 

query을 변경하지 않습니다. 다음 줄의 query.Load()은 술어를 무시합니다. query.Load()이 아니고 query.Where<City>(predicate).Load()이 아닙니다. 그것은 C#을 정말 실제로 또한이 문으로 사용하는 것을 허용하지 않습니다 당신이 예에서

int i = 3; 
i + 1; 
Console.WriteLine(i); // still prints 3 

을 쓴 것처럼, 그러나 .Where(predicate)는 메소드 호출이고, 메소드 호출로 사용할 수 있습니다 그러한 경우에도 값을 반환합니다.

이것은 유일한 문제는 아니지만 (다른 답변을 참조하십시오.) 제 생각에이 문제는 예상치 못한 결과를 초래하는 문제입니다.