본문 바로가기

프로그램언어/C#

LINQ(Language-Integrated Query)

LINQ

LINQ(Language-Integrated Query)C# 언어에 직접 쿼리 기능을 통합하는 방식을 기반으로 하는 기술 집합 이름입니다. 일반적으로 데이터에 대한 쿼리는 컴파일 시간의 형식 검사나 IntelliSense 지원 없이 간단한 문자열로 표현됩니다. 또한 데이터 원본의 각 유형에 대해 다른 쿼리 언어를 배워야 합니다. SQL 데이터베이스, XML 문서, 다양한 웹 서비스 등. LINQ를 사용할 경우 쿼리는 클래스, 메서드, 이벤트와 같은 고급 언어 구문이 됩니다. 언어 키워드 및 친숙한 연산자를 사용하여 강력한 형식의 개체 컬렉션에 대해 쿼리를 작성합니다. LINQ 기술은 개체(LINQ to Objects), 관계형 데이터베이스(LINQ to SQL) XML(LINQ to XML)에 대한 일관성 있는 쿼리 환경을 제공합니다.

 

쿼리를 작성하는 개발자의 경우 LINQ에서 가장 눈에 잘 띄는 "언어 통합" 부분은 쿼리 식입니다. 쿼리 식은 선언적 쿼리 구문 으로 작성됩니다. 쿼리 구문을 사용하면 최소한의 코드로 데이터 소스에 대해 필터링, 정렬 및 그룹화 작업을 수행할 수 있습니다. 동일한 기본 쿼리 식 패턴을 사용하여 SQL 데이터베이스, ADO.NET 데이터 세트, XML 문서 및 스트림, .NET 컬렉션에서 데이터를 쿼리하고 변환할 수 있습니다.

 

데이터 질의 기능

From : 데이터 소스 지정

Where : 필터 적용(조건)

Select : 반환되는 요소 형식을 지정

 

예제]

using System;
using System.Linq;
 
namespace ConsoleApp1 {
    class Program {
        static void Main(string[] args) {
            int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
 
            var numQuery =
                from num in numbers
                where (num % 2) == 0
                select num;
 
            foreach (int num in numQuery) {
                Console.WriteLine("{0,1} ", num);
            }
        }
    }
}
실행결과]
0
2
4
6

 

 Linq를 이용하여 짝수를 오름차순으로 출력하시오.

using System;
using System.Linq;
 
namespace ConsoleApp1 {
    class Program {
        static void Main(string[] args) {
            int[] numbers = { 9, 2, 6, 4, 5, 3, 7, 8, 1, 10};
 
            var result = from n in numbers
                where n % 2 == 0
                orderby n ascending
                select n;

            Console.WriteLine("오름차순");
            foreach (int n in result)
                Console.WriteLine("{0}", n);

            result = from n in numbers
                where n % 2 == 0
                orderby n ascending
                select n;

            Console.WriteLine("내림차순");
            foreach (int n in result)
                Console.WriteLine("{0}", n);

        }
    }
}
실행결과]
오름차순
2
4
6
8
10
내림차순
10
8
6
4
2

 

예제

using System;
using System.Linq;
 
namespace ConsoleApp1 {
    class Profile {
        public string Name { get; set; }
        public int Height { get; set; }
        public float Weight { get; set; }
    }
    class Program {
        static void Main(string[] args) {
            Profile[] arrMember =
            {
                new Profile() {Name="둘리", Height=152, Weight=35.5f },
                new Profile() {Name="희동이", Height=105, Weight=27.8f },
                new Profile() {Name="고길동", Height=168, Weight=70.2f },
                new Profile() {Name="또치", Height=160, Weight=32.7f },
                new Profile() {Name="도우너", Height=153, Weight=40.6f }
            };
 
            var resQuery = from profile in arrMember
                                        where profile.Height < 160
                                        orderby profile.Height
                                        select new
                                        {
                                             profile.Name,
                                             profile.Height,
                                             profile.Weight
                                         };
 
            foreach (var profile in resQuery)
                Console.WriteLine("{0}\t{1}\t{2}", profile.Name, profile.Height,
                profile.Weight);

     }
    }
}
실행결과]
희동이  105     27.8
둘리    152     35.5
도우너  153     40.6

 

여러 개의 데이터 원본에 질의하기

using System;
using System.Linq;

namespace ConsoleApp1
{
    class Class
    {
        public string Name { get; set; }
        public int[] Score { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Class[] arrClass = {
                new Class() {Name="둘리", Score= new int[] { 90, 80, 70, 60} },
                new Class() {Name="희동이", Score= new int[] { 40, 50, 60, 50} },
                new Class() {Name="고길도", Score= new int[] { 100, 85, 90, 85} },
                new Class() {Name="도우너", Score= new int[] { 90, 50, 70, 50} },
                new Class() {Name="또치", Score= new int[] { 50, 70, 40, 60} }
            };

            var classes = from c in arrClass
                          from s in c.Score
                          where s < 50
                          orderby s
                          select new { c.Name, Lowest = s };

            foreach (var c in classes)
                Console.WriteLine("과락 : {0} ({1})", c.Name, c.Lowest);
        }
    }
}
실행결과]
과락 : 희동이 (40)
과락 : 또치 (40)

 

'프로그램언어 > C#' 카테고리의 다른 글

정렬  (0) 2021.12.27
스레드와 태스크  (0) 2021.06.28
람다식  (0) 2021.06.23
델리게이트와 이벤트  (0) 2021.06.22
문제풀기1  (0) 2021.06.07