programing

IQueryable과 INumberable의 차이점은 무엇입니까?

skycolor 2023. 5. 12. 21:57
반응형

IQueryable과 INumberable 차이점은 무엇입니까?

사이의 차이점은 무엇입니까?IQueryable<T>그리고.IEnumerable<T>?


참고 항목이 질문과 겹치는 IQueryable과 IEnumberable의 차이점

우선, 확장 기능을 제공합니다.IEnumerable<T>', ' '인터페이스', '인터페이스', '인터페이스', '인터페이스', '인터페이스', '인터페이스', '인터페이스', '', '인터페이스', '인터페이스', '' 거IEnumerable<T> 당은또할수있다니습으로 할 수.IQueryable<T>.

IEnumerable<T> 금방전에가 있습니다.GetEnumerator()Enumerator<T>을 른바라고 수 .MoveNext()T의 시퀀스를 통해 반복하는 방법.

무엇을IQueryable<T>그것을 가지고 있습니까?IEnumerable<T> 쿼리 공급자(예: LINQ to SQL 공급자)를 가리키는 속성과 다음을 나타내는 쿼리 표현식을 가리키는 속성은 특별히 두 가지가 아닙니다.IQueryable<T>객체는 지정된 쿼리 공급자가 이해할 수 있는 런타임 이동식 추상 구문 트리입니다(대부분 예외가 발생하지 않는 한 LINQ to Entities 공급자에게 LINQ to SQL 식을 제공할 수 없습니다).

표현식은 단순히 객체 자체의 상수 표현식이거나 쿼리 연산자 및 피연산자로 구성된 집합의 보다 복잡한 트리일 수 있습니다.의 "정보"IQueryProvider.Execute()또는IQueryProvider.CreateQuery()메서드는 전달된 식을 사용하여 호출된 다음 쿼리 결과 또는 다른 결과 중 하나입니다.IQueryable각각 반환됩니다.

이것은 유튜브에서 이 인터페이스들이 어떻게 다른지 보여주는 멋진 비디오입니다. 볼만한 가치가 있습니다.

다음은 이에 대한 긴 설명 답변입니다.

해야 할 첫 한 점은 기해야할첫번중점은입니다.IQueryable는 인페이대상에서 됩니다.IEnumerable그러니 뭐니뭐든IEnumerable할 수 있습니다.IQueryable할 수도 있습니다.

여기에 이미지 설명 입력

많은 차이가 있지만 가장 큰 차이를 만드는 하나의 큰 차이에 대해 논의해 보겠습니다.IEnumerable 인터페이스는 컬렉션이 로드될 때 유용합니다.LINQ또는 엔티티 프레임워크에서 필터를 적용할 수 있습니다.

다과같은간코사용다니합드를단한음을 사용하는 .IEnumerable엔티티 프레임워크를 사용합니다.를 사용하는 것입니다.Where다음 사용자의 레코드를 가져오기 위한 필터EmpId이라2.

EmpEntities ent = new EmpEntities();
IEnumerable<Employee> emp = ent.Employees; 
IEnumerable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();

됩니다. 여기서 필터는IEnumerable, 하여 즉, 모와 함께 를 얻습니다.EmpId이라2.

여기에 이미지 설명 입력

하지만 이제 우리가 변경한 아래 코드를 보십시오.서버 측에서 SQL 쿼리를 생성하고 필요한 데이터만 클라이언트 측으로 전송합니다.

EmpEntities ent = new EmpEntities();
IQueryable<Employee> emp = ent.Employees;
IQueryable<Employee> temp =  emp.Where(x => x.Empid == 2).ToList<Employee>();

여기에 이미지 설명 입력

그래서 사이의 차이점은IQueryable그리고.IEnumerable는 필터 로직이 실행되는 위치에 관한 것입니다.하나는 클라이언트 측에서 실행되고 다른 하나는 데이터베이스에서 실행됩니다.

수집만 ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜIEnumerable와 다음과 같이 하십시오.IQueryable은 네트워크 트래픽을 줄이고 SQL 언어의 성능을 사용하기 때문에 더 나은 선택입니다.

큰 은 "LINQ"에 대한 입니다.IQueryable<T>가지고 가다Expression대리인 대신 객체. 즉, 수신하는 사용자 지정 쿼리 로직(예: 술어 또는 값 선택기)이 메서드에 대한 대리인 대신 식 트리의 형태입니다.

  • IEnumerable<T>하는 것은 , ,▁that▁is만▁but지메▁with적하▁sequences합,▁working-▁great.
  • IQueryable<T>데이터베이스 또는 웹 서비스와 같은 원격 데이터 원본과 같은 메모리 부족을 허용합니다.

쿼리 실행:

  • 쿼리 실행이 "프로세스 중"으로 수행될 경우 일반적으로 필요한 것은 쿼리의 각 부분을 실행하기 위한 코드(코드)뿐입니다.

  • 실행이 프로세스 밖에서 수행되는 경우, LINQ 공급자가 LDAP 쿼리, SQL 등 메모리 부족 실행에 적합한 형식으로 변환할 수 있도록 쿼리의 논리를 데이터로 표시해야 합니다.

자세한 내용:

http://www.codeproject.com/KB/cs/646361/WhatHowWhere.jpg

IEnumberable: IEnumberable은 메모리 내 수집(또는 로컬 쿼리) 작업에 가장 적합합니다.IEnumberable은 항목 간에 이동하지 않으며 전달 전용 컬렉션입니다.

IQueryable:데이터베이스나 웹 서비스(또는 원격 쿼리)와 같은 원격 데이터 소스에 가장 적합한 IQueryable Best Squit입니다.IQueryable은 페이징 및 구성 기반 쿼리와 같은 다양한 흥미로운 지연 실행 시나리오를 지원하는 매우 강력한 기능입니다.

따라서 메모리 내 컬렉션을 통해 간단히 반복해야 하는 경우 IEnumberable을 사용하고, Dataset 및 기타 데이터 소스와 같은 컬렉션을 조작해야 하는 경우 IQueryable을 사용합니다.

간단히 말해서, IEnumberable은 서버 측에서 선택 쿼리를 실행하고, 클라이언트 측에서 메모리 내 데이터를 로드한 다음, IQueryable은 모든 필터를 사용하여 서버 측에서 선택 쿼리를 실행합니다.

실제로 LINQ-to-SQL과 같은 ORM을 사용하는 경우

  • IQueryable을 생성하면 쿼리가 sql로 변환되어 데이터베이스 서버에서 실행될 수 있습니다.
  • IE 번호 테이블을 만들면 쿼리를 실행하기 전에 모든 행이 개체로 메모리로 당겨집니다.

두 경우 모두, 만약 당신이 전화하지 않습니다.ToList()또는ToArray()에 예를 그면쿼사때실로므마, 행들어은당, 있습니다.IQueryable<T>목록 상자 4개를 채우면 데이터베이스에 대해 쿼리가 4번 실행됩니다.

또한 쿼리 범위를 확장하는 경우:

q.Where(x.name = "a").ToList()

그런 다음 IQueryable을 사용하면 생성된 SQL에 "where name = "a"가 포함되지만 IEnumber를 사용하면 더 많은 역할이 데이터베이스에서 풀링됩니다. 그러면 x.name = "a" 검사가 수행됩니다.그물.

우리는 사용합니다.IEnumerable그리고.IQueryable데이터베이스에서 검색되는 데이터를 조작합니다. IQueryable는 에상됨속서의 상속을 받습니다.IEnumerable,그렇게IQueryable 모든것포다가 되어 있습니다.IEnumerable특들징주. 의차요은의 주요 IQueryable그리고.IEnumerable은 것은입니다.IQueryable필터를 사용하여 쿼리를 실행하는 반면IEnumerable먼저 쿼리를 실행한 다음 조건에 따라 데이터를 필터링합니다.

아래에서 더 자세한 차별화 요소를 확인하십시오.

IEnumberable

  1. IEnumerable합니다.System.Collections
  2. IEnumerable한 후 data를 합니다.
  3. IEnumerable, Array와 데 합니다.
  4. IEnumerableLINQ to Object 및 LINQ to XML 파일입니다.

IQueryable

  1. IQueryable합니다.System.Linq
  2. IQueryablequery'를합니다.
  3. IQueryable Out-Memory 데 합니다.
  4. IQueryableLINQ to SQL 쿼리에 유용합니다.

그렇게IEnumerable컬렉션을 때되는 반면, 일적으메로내모수처반데면사는용되리는하집리을반▁is,IQueryable일반적으로 수집을 조작하는 데 사용됩니다.

아래에 언급된 작은 테스트는 IQueryable 간의 차이의 한 측면을 이해하는 데 도움이 될 수 있습니다.<및 I 번호 가능<. 다른 사람의 게시물에 수정사항을 추가하려고 했던 이 게시물에서 이 답변을 재현했습니다.

DB(DDL 스크립트)에 다음과 같은 구조를 만들었습니다.

CREATE TABLE [dbo].[Employee]([PersonId] [int] NOT NULL PRIMARY KEY,[Salary] [int] NOT NULL)

레코드 삽입 스크립트(DML 스크립트)는 다음과 같습니다.

INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(1, 20)
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(2, 30)
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(3, 40)
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(4, 50)
INSERT INTO [EfTest].[dbo].[Employee] ([PersonId],[Salary])VALUES(5, 60)
GO

이제 제 목표는 데이터베이스의 Employee 테이블에서 상위 2개의 레코드를 가져오는 것이었습니다.저는 Visual Studio(VS)에서 새로운 C# 콘솔 애플리케이션을 만들었습니다.그런 다음 ADO를 추가했습니다.데이터베이스의 Employee 테이블을 가리키는 NET EDMX(Entity Data Model XML) 항목.이제 LINQ 쿼리 작성을 시작할 수 있습니다.

사례 I: IQueryable 경로 코드

using (var efContext = new EfTestEntities())
{
    IQueryable<int> employees = from e in efContext.Employees  select e.Salary;
    employees = employees.Take(2);

    foreach (var item in employees)
    {
        Console.WriteLine(item);
    }
}

이 프로그램을 실행하기 전에 SQL Server 인스턴스에서 SQL Query 프로파일러 세션을 시작했습니다.다음은 실행 요약입니다.

  1. 실행된 총 쿼리 수: 1

  2. 쿼리 텍스트:

    SELECT TOP (2) [c].[Salary] AS [Salary] FROM [dbo].[Employee] AS [c]
    

우리는 IQueryable이 다음을 적용할 수 있을 만큼 충분히 똑똑하다는 것을 알 수 있습니다.Top (2)데이터베이스 서버 자체의 절입니다.따라서 네트워크를 통해 레코드 5개 중 2개만 가져옵니다.클라이언트 측에서는 더 이상 메모리 내 필터링이 필요하지 않습니다.

사례 II: IEnumberable 경로 코드

using (var efContext = new EfTestEntities())
{
    IEnumerable<int> employees = from e in efContext.Employees  select e.Salary;
    employees = employees.Take(2);

    foreach (var item in employees)
    {
        Console.WriteLine(item);
    }
}

이 경우의 실행 요약:

  1. 실행된 총 쿼리 수: 1

  2. SQL 프로파일러에서 캡처된 쿼리 텍스트:

    SELECT [Extent1].[Salary] AS [Salary] FROM [dbo].[Employee] AS [Extent1]
    

여기서 주목해야 할 점은 IEnumberable이 Sales 테이블에 있는 5개의 레코드를 모두 가져온 다음 상위 2개의 레코드를 얻기 위해 클라이언트 측에서 메모리 내 필터링을 수행했다는 것입니다.따라서 네트워크를 통해 더 많은 데이터(이 경우 3개의 추가 레코드)가 전송되어 대역폭을 불필요하게 소모했습니다.

IEnumberable은 컬렉션을 참조하지만 IQueryable은 쿼리일 뿐이며 식 트리 내에서 생성됩니다.데이터베이스에서 데이터를 가져오기 위해 이 쿼리를 실행합니다.

제가 비슷한 게시물에 (이 주제에 대해) 쓴 글이 있습니다.(그리고 아니요, 저는 보통 제 말을 인용하지 않지만, 이것들은 매우 좋은 기사들입니다.)

"이 기사는 도움이 됩니다.LINQ-to-SQL에서 IQueryable과 IEnumberable을 비교합니다.

MSDN 문서에 따르면 IQueryable에서 호출되는 것은 내부 식 트리를 대신 작성하여 작동합니다."IQueryable(Of T)을 확장하는 이러한 메서드는 직접 쿼리를 수행하지 않습니다.대신 누적 쿼리를 나타내는 표현식 트리인 표현식 개체를 만드는 기능이 있습니다."'

표현식 트리는 C# 및 에서 매우 중요한 구성 요소입니다.NET 플랫폼. (일반적으로 중요하지만 C#은 매우 유용합니다.)차이를 더 잘 이해하기 위해 공식 C# 5.0 사양표현식문장의 차이에 대해 여기에서 읽는 것을 추천합니다.람다 미적분학으로 분기되는 고급 이론적 개념의 경우, 식을 사용하면 방법을 1등급 객체로 지원할 수 있습니다.IQueryable과 IEnumberable의 차이는 이 점을 중심으로 합니다.IQueryable은 표현 트리를 만드는 반면 IEnumberable은 적어도 마이크로소프트의 비밀 연구소에서 일하지 않는 사람들에게는 일반적으로 그렇지 않습니다.

푸시 대 풀 관점의 차이를 자세히 설명하는 또 다른 매우 유용한 기사가 있습니다. ("푸시" 대 "풀") 데이터 흐름의 방향을 언급하는 것입니다.의 반응형 프로그래밍 기술.NET 및 C#

여기 문장 lambdas와 표현 lambdas의 차이를 자세히 설명하고 표현 tress의 개념을 더 깊이 있게 논의하는 매우 좋은 기사가 있습니다: C# 대리인, 표현 트리 및 람다 표현 대 람다 표현."

만약 우리가 데이터베이스로부터 엄청난 양의 데이터를 다루고 있다면 IQueryable은 IEnumberable보다 빠릅니다. 왜냐하면,IQueryable은 데이터베이스에서 필요한 데이터만 가져오는 반면 IEnumberable은 데이터베이스에서 필요에 관계없이 모든 데이터를 가져옵니다.

ienumberable: 프로세스 중 메모리를 처리하고자 할 때, 즉 데이터 연결을 쿼리할 수 없는 경우: sql 서버를 처리할 때, 즉 데이터 연결 ilist를 처리할 때: 객체 추가, 객체 삭제 등의 작업

언급URL : https://stackoverflow.com/questions/252785/what-is-the-difference-between-iqueryablet-and-ienumerablet

반응형