개발 이야기/ORM2012. 4. 15. 12:28

LINQ 알고가자

엔티티 프레임워크에서는 엔티티를 질의하는데 LINQ문을 사용합니다하여 이번에는 LINQ의 기본적인 사용법에 대해서 알아보자.

 

LINQ?

LINQ(Language Integrated Query )는 통합언어 쿼리로 .NET Framework 3.5에 포함되었다. LINQ to Object, LINQ to SQL, LINQ to XML로 크게 나눌 수 있는데 이는 데이터베이스, XML 등등 개체화하는 데이터 소스에 대해서 전반적으로 쉽게 질의 할 수 있게 제공한다.

3_1.jpg

[그림 3-1] .NET LINQ

이번 세션의 목표는 LINQ 문법을 익히는데 중점을 두며 아래 URL에 가면 LINQ 샘플을 다운로드 받아 볼 수 있는데 샘플을 기준으로 각각의 표현식을 설명하려합니다부족한 부분은 샘플을 다운받아서 한번씩 살펴보시기 바랍니다.
LINQ 샘플 다운로드 URL - http://msdn.microsoft.com/ko-kr/vcsharp/aa336746.aspx

LINQ는 쿼리 표현식과 람다식 함수로 나눠 작성할 수 있습니다예제는 주로 쿼리 표현식으로 작성하겠습니다더 람다식에 대해 더 자세히 공부하고 싶으신 분은 아래 링크를 참고하세요.
람다 식(C# 프로그래밍 가이드) - http://msdn.microsoft.com/ko-kr/library/bb397687.aspx

 

기본 표현식

Select
기본 데이터소스에서 특정 개체를 조회해오는 구문입니다구문 작성은 SQL구문과 비슷해서 쉽게 익힐 수 있다.

 

        public static void Select1()

        {

            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

 

            var numsPlusOne = from n in numbers

                              select n + 1;

 

            Console.WriteLine("Numbers + 1:");

            foreach (var i in numsPlusOne)

            {

                Console.WriteLine(i);

            }

        }

    }

 

3_2.jpg

[그림 3-2] Select 실행 결과

Where

해당 조건에 맞는 데이터를 조회할 경우 사용한다.

 

        public static void Where1()

        {

            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

 

            var lowNums = from n in numbers

                          where n < 5

                          select n;

 

            Console.WriteLine("Numbers < 5:");

            foreach (var x in lowNums)

            {

                Console.WriteLine(x);

            }

        }

 

3_3.jpg

[그림 3-3] Where 실행 결과

LINQ는 지연된 쿼리라는 특성을 가지고 있습니다이는 데이터 조건이 실행되어 결과 집합으로 가지고 있는것이 아니라 조건을 출력하는 시점에서 실행이 되는 것을 뜻합니다즉 위의 표현식에서 살펴보면 실제로 위에 해당되는 쿼리가 실행되는 시점은 출력을 요청하는 foreach 구문 내부입니다이를 지연된 쿼리라고 불리며 개발자의 설정에 따라 즉시실행을 할 수도 있습니다.

OrderBy

데이터 정렬하는 표현식입니다.

 

        public static void OrderBy1()

        {

            string[] words = { "cherry""apple""blueberry" };

 

            var sortedWords = from w in words

                              orderby w

                              select w;

 

            Console.WriteLine("The sorted list of words:");

            foreach (var w in sortedWords)

            {

                Console.WriteLine(w);

            }

        }

 

3_4.jpg

[그림 3-4] OrderBy 실행 결과

역정렬을 원하는 경우 descending” 구문만 추가해주면 됩니다.^^

 

            var sortedDoubles = from d in doubles

                                orderby d descending

                                select d;

 

 

집계 표현식

LINQ는 집계 연산을 수행하는 함수를 기본적으로 제공합니다기본함수에는 Count, Sum, Min/Max, Average, Aggregate 등등이 있다대표해서 몇가지만 알아보자.

Count

조회된 데이터의 Row수를 리턴합니다. LINQ는 기본적인 메서드를 제공하는데 Count 메서드만 호출하면 조회된 결과의 개수를 반환합니다. Count2 메서드는 조건에 해당하는 결과만 반환하게 됩니다.

 

        public void Count1()

        {

            int[] factorsOf300 = { 2, 2, 3, 5, 5 };

            int uniqueFactors = factorsOf300.Distinct().Count();

            Console.WriteLine("There are {0} unique factors of 300.", uniqueFactors);

        }

 

        public void Count2()

        {

            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

            int oddNumbers = numbers.Count(n => n % 2 == 1);

            Console.WriteLine("There are {0} odd numbers in the list.", oddNumbers);

        }

 

3_5.jpg

[그림 3-5] Count 실행 결과

Sum

Sum은 집합의 합계를 반환합니다. Count와 동일하게 Sum 메서드만 호출하면 됩니다.

 

        public void Sum1()

        {

            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

            double numSum = numbers.Sum();

            Console.WriteLine("The sum of the numbers is {0}.", numSum);

        }

 

        public void Sum2()

        {

            string[] words = { "cherry""apple""blueberry" };

            double totalChars = words.Sum(w => w.Length);

            Console.WriteLine("There are a total of {0} characters in these words.", totalChars);

        }

 

3_6.jpg

[그림 3-6] Sum 실행 결과

Min/Max

조회된 결과값의 최소값/최대값을 반환합니다.

 

        public static void Min1()

        {

            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

            int minNum = numbers.Min();

            Console.WriteLine("The minimum number is {0}.", minNum);

        }

 

        public static void Max1()

        {

            int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

            int maxNum = numbers.Max();

            Console.WriteLine("The maximum number is {0}.", maxNum);

        }

 

 3_7.jpg

[그림 3-7] Min/Max 실행 결과

 

기타 표현식

Join

서로다른 데이터를 조인하여 결과를 반환하는 구문입니다관계형 데이터베이스 경우 이런 구문을 자주 사용하여 데이터를 조회합니다아래 소스는 카테고리가 동일한 데이터만 출력하는 예제입니다.

 

        public static void Join1()

        {

            string[] categories = new string[]{ "Beverages""Condiments""Vegetables""Dairy Products""Seafood" };

            List<Product> products = GetProductList();

 

            var q = from c in categories

                    join p in products on c equals p.Category

                    select new { Category = c, p.ProductName };

 

            foreach (var v in q)

                Console.WriteLine(v.ProductName + ": " + v.Category);

        }

 

        private static List<Product> GetProductList()

        {

            List<Product> products = new List<Product>();

            products.Add(new Product("Beverages""Beverages1"));

            products.Add(new Product("Vegetables""Vegetables1"));

            products.Add(new Product("Dairy Products""Dairy Products1"));

            products.Add(new Product("Seafood""Seafood1"));

            products.Add(new Product("Source""Source1"));

 

            return products;

        }

 

 3_8.jpg

[그림 3-8] Join 실행 결과

 Into

Database에 프로시져에서 임시로 데이터를 저장 해놓는 temp table을 사용할 경우가 있습니다그와 같이 into문도 임시로 데이터를 저장해야할 경우에 사용하는 구문입니다즉 임시 저장소를 만드는 것이지요~

 

            var orderGroups = from prod in products

                              group prod by prod.Category into prodGroup

                              select prodGroup;

 

소스를 보면 prod라는 개체에서 Category별로 그룹을 지었습니다그 결과를 into구문을 사용하여 prodGroup에 담았습니다최종적으로 prodGroup 결과를 반환하게 됩니다어떤 의미로 사용하는지 아시겠지요??? ^.^

 

LINQ는 앞으로 엔티티 프레임워크를 나가기 전에 사전에 준비되어야 하는 사항인지라 간략하게 알아보았습니다작성된 샘플(EF4.03.zip)을 함께 업로드 해드리겠습니다참고해주시고 끝까지 읽어주셔서 감사합니다.~~*

sqler에 아티클 작성 했던것을 공유합니다.

출처 : http://www.sqler.com/390183


Posted by 사나에