code

List () 대신 AsQueryable ()을 사용하는 이유는 무엇입니까?

codestyles 2021. 1. 6. 08:21
반응형

List () 대신 AsQueryable ()을 사용하는 이유는 무엇입니까?


비 테스트 리포지토리 구현의 토대로 서 Entity FrameworkLINQ 와 함께 데이터 액세스에 리포지토리 패턴을 사용하고 있습니다. 내가 보는 대부분의 샘플은 호출이 List <T> 대신 N 레코드를 반환 할 때 AsQueryable ()을 반환합니다. 이렇게하면 어떤 이점이 있습니까?


AsQueryable은 목록을 가져 오는 데 필요한 명령 인 쿼리를 생성합니다. 데이터베이스 수준까지 전송되는 새 Where 절을 추가하는 등 나중에 쿼리를 추가로 변경할 수 있습니다.

AsList는 메모리의 모든 항목이 포함 된 실제 목록을 반환합니다. 새로운 Where 단서를 추가하면 데이터베이스가 제공하는 빠른 필터링을 얻지 못합니다. 대신 목록의 모든 정보를 얻은 다음 응용 프로그램에서 필요하지 않은 정보를 필터링합니다.

따라서 기본적으로 자신을 저지하기 전에 가능한 마지막 순간까지 기다리는 것입니다.


반환 IQueryable<T>은 결과를 실제로 열거하기 시작할 때까지 실행이 더 달라지고 다른 쿼리로 쿼리를 작성하고 여전히 서버 측 실행을 얻을 수 있다는 이점이 있습니다.

문제는이 메서드에서 데이터베이스 컨텍스트의 수명을 제어 할 수 없다는 것입니다. 열린 컨텍스트가 필요하고 쿼리가 실행될 때까지 열려 있는지 확인해야합니다. 그런 다음 컨텍스트가 삭제되었는지 확인해야합니다. 당신이 같은 결과를 반환하는 경우 List<T>, T[]또는 비슷한, 당신은 DEFFERED 실행 및 구성 쿼리 서버 측 실행을 풀어 있지만 데이터베이스 컨텍스트의 수명을 제어 할 승리.

물론 가장 적합한 것은 실제 요구 사항에 따라 다릅니다. 하나의 진실이없는 또 다른 질문입니다.


AsQueryableIEnumerable<T>두 가지 작업을 수행 할 수 있는 확장 방법입니다 .

  • 는 IF IEnumerable<T>구현 IQueryable<T>justs 캐스트, 아무것도하지 않고.
  • 그렇지 않으면 람다를 컴파일하고 Enumerable 확장 메서드를 호출하는 모든 메서드를 구현 하는 '가짜' IEnumerable<T>( EnumerableQuery<T>)가 생성 됩니다.

따라서 대부분의 경우 AsQueryable을 사용하는 것은 쓸모가 없습니다. u가 강제로 IQueryable을 메서드에 전달하고 대신 IEnumerable을 가지지 않는 한 그것은 해킹입니다.

참고 : AsQueryable은 해킹이지만 IQueryable은 물론 아닙니다!


반환 IQueryable<T>은 결과가 실제로 사용될 때까지 쿼리 실행을 연기합니다. 그때까지는에서 추가 데이터베이스 쿼리 작업을 수행 할 수도 있습니다 IQueryable<T>. A의 List당신은 일반적으로 효율성이 떨어지는 메모리 작업으로 제한하고 있습니다.

참조 URL : https://stackoverflow.com/questions/1106802/why-use-asqueryable-instead-of-list

반응형