C#/LINQ

[C#]LINQ와 IEnumerable, IQueryable 인터페이스

DevStory 2022. 7. 10.

이번 포스팅은 C#의 IEnumerable, IQueryable 인터페이스에 대해 설명합니다. C#의 LINQ를 사용하여 예제를 설명하므로 LINQ에 대해 모르시는 분들은 아래 포스팅을 읽어주시길 바랍니다.

 

[C#]링크(LINQ)란?

LINQ란? LINQ(Language-INtegrated Query)의 약자인 LINQ는 데이터 질의(Query) 기능을 C#에서 사용할 수 있는 기술입니다. 쉽게 설명하자면 C#의 배열, 컬렉션, XML, DataSet 등... 에서 내가 원하는 데이터만 가..

developer-talk.tistory.com

 

[C#]LINQ 질의 구문과 메서드 구문

LINQ를 사용하여 원하는 데이터를 추출하기 위해 질의(Query)를 작성하는 방법은 질의 구문(Query Syntax)과 메서드 구문(Method Syntax)이 존재합니다. 질의 구문과 메서드 구문은 동일한 작업을 수행하지

developer-talk.tistory.com


var 키워드

다음 예제는 string 배열에서 첫 번째 문자열이 "A"로 시작하고 문자열의 길이가 3보다 큰 요소를 LINQ로 추출합니다.

class Program
{
  static void Main(string[] args)
  {
    string[] strArr = { "Apple", "Banana", "Car", "Angular", "Add", "Sum" };

    var linqResult = from str in strArr
                     where str.StartsWith("A") && str.Length > 3
                     select str;

    foreach (var str in linqResult)
      Console.Write(str + " ");
  }
}

LINQ의 질의 결과를 var 타입으로 선언된 변수에 저장합니다. 변수 linqResult에 마우스 포인터를 올려놓으면 다음 사진처럼 제네릭 타입인 IEnumerable<string>이라는 것을 확인할 수 있습니다.

그렇다면, var 타입으로 선언된 변수는 모두 제네릭 타입인가? 그렇지 않습니다.

 

var 키워드는 익명 타입으로 C# 컴파일러가 할당된 값을 확인 후 타입을 정합니다. 다음 사진처럼 var 키워드로 선언된 변수 str에 문자열 "Hello"를 초기화했으므로 컴파일러는 변수 str의 타입을 string으로 설정합니다.

var 키워드에 대한 내용은 아래 포스팅에서 확인할 수 있습니다.

 

[C#]익명 타입(Anonymous Type)

익명 타입(Anonymous Type)이란? 익명 타입은 C# 3.0에서 추가된 키워드로 타입이 지정되지 않은 변수를 var 키워드로 선언할 수 있습니다. 익명 타입으로 변수를 선언하는 경우 변수 초기화 값을 기반

developer-talk.tistory.com

즉, var 키워드로 선언된 변수는 할당된 값에 따라 타입이 정해지므로 LINQ 질의 결과는 제네릭 타입인 IEnumerable<T>라는 것을 알 수 있습니다.


IEnumerable 인터페이스

이제, IEnumerable 인터페이스가 무엇인지 알아봅시다. IEnumerable 인터페이스는 System.Collection 네임스페이스에서 사용할 수 있는 인터페이스로 대부분의 컬렉션 클래스는 IEnumerable 인터페이스를 구현합니다.

 

Collection의 List 클래스

Collection의 Stack 클래스

Collection의 Dictionary 클래스

IEnumerable 인터페이스는 일종의 반복 디자인 패턴으로 IEnumerable 인터페이스를 구현한 객체를 순회할 수 있다는 것을 의미합니다. 컬렉션 객체에서 foreach문을 사용할 수 있는 이유도 IEnumerable 인터페이스가 구현되어있기 때문이죠.

 

이번 포스팅에서는 "아! LINQ 질의 결과는 IEnumerable 인터페이스구나!" 정도로 이해하시면 되고 세부적인 내용은 아래 포스팅에서 확인할 수 있습니다.

 

[C#]IEnumerable 인터페이스란?

IEnumerable 인터페이스란? IEnumerable은 List, Stack, Queue와 같은 컬렉션에 반복이 필요한 경우 사용되는 인터페이스입니다. 기본적으로 컬렉션은 이미 IEnumerable 인터페이스를 가지기 때문에 foreach문을.

developer-talk.tistory.com


IEnumerable 인터페이스 예제

LINQ 질의 결과가 IEnumerable 인터페이스이므로 LINQ 질의 결과를 var 타입이 아닌 IEnumerable 타입으로 선언할 수 있습니다.

class Program
{
  static void Main(string[] args)
  {
    string[] strArr = { "Apple", "Banana", "Car", "Angular", "Add", "Sum" };

    IEnumerable<string> linqResult = from   str in strArr
                                     where  str.StartsWith("A") && str.Length > 3
                                     select str;

    foreach (var str in linqResult)
      Console.Write(str + " ");
  }
}

[실행 결과]

Apple Angular

IQueryable 인터페이스

이번에는 IQueryable 인터페이스에 대해 알아봅시다.

IQueryable 인터페이스는 IEnumerable 인터페이스와 달리 System.Linq 네임스페이스에 정의되어 있으며, IEnumerable 인터페이스의 자식 인터페이스입니다.

 

IQueryable 인터페이스에는 IQueryprovider 인터페이스 타입인 Provider 프로퍼티가 존재합니다. IQueryProvider 인터페이스를 살펴봅시다.

IQueryProvider 인터페이스에서 제공하는 메서드는 Linq 공급자를 만드는데 사용됩니다. Linq 공급자는 SQL, Entities가 될 수 있습니다.

 

배열이나 컬렉션도 IQueryProvider 인터페이스에서 제공하는 메서드를 사용하여 Linq 공급자로 만들 수 있지만, IQueryProvider 인터페이스에서 배열이나 컬렉션을 Linq 공급자로 만드는 행위는 상당히 비효율적입니다.

 

음.. 그래서 IEnumerable 인터페이스와 IQueryable 인터페이스의 차이가 뭔데?

 

데이터베이스에서 특정 데이터를 필터해야한다고 가정합시다.

- IEnumerable 인터페이스는 모든 데이터를 C# 애플리케이션에 가져와서 필터 합니다.

- IQueryable 인터페이스는 DataBase에서 필터 된 데이터를 가져옵니다.

 

즉, "어디서 필터 할 것인가?"라는 차이점이 있습니다. 별도의 DataBase 서버가 존재하는 경우 IQueryable 인터페이스를 활용하여 C# 애플리케이션 작업 부담을 덜어줄 수 있습니다.

 

이미 C# 애플리케이션 메모리에 데이터가 로드된 경우에는 IEnumerable 인터페이스를 활용하여 데이터를 필터하는 것이 좋습니다.


IQueryable 인터페이스 예제

다음 예제는 LINQ 질의 결과를 IQueryable 제네릭 타입으로 선언된 변수에 할당합니다. 질의 결과를 IQueryable 타입으로 받기 위해서는 AsQueryable() 메서드를 호출해야 합니다.

class Program
{
  static void Main(string[] args)
  {
    string[] strArr = { "Apple", "Banana", "Car", "Angular", "Add", "Sum" };

    IQueryable<string> linqResult = (from   str in strArr
                                     where  str.StartsWith("A") && str.Length > 3
                                     select str).AsQueryable();

    foreach (var str in linqResult)
      Console.Write(str + " ");
  }
}

[실행 결과]

Apple Angular
반응형

'C# > LINQ' 카테고리의 다른 글

[C#]LINQ Select절  (0) 2022.07.10
[C#]LINQ 확장 메서드  (0) 2022.07.10
[C#]LINQ 중복 제거  (0) 2022.07.10
[C#]LINQ 질의 구문과 메서드 구문  (0) 2022.07.10
[C#]링크(LINQ)란?  (1) 2022.07.09

댓글