본문 바로가기

ETC Programmings

[C#] LINQ 의 사용

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

LINQ를 사용해 보기 위해서 DB를 사용해보려는 시나리오가 있었지만 사실상 C#에서의 DB 접속을 위한 ADO.NET 이라는 부분은 배우지 못했기에 Collection 객체인 List 를 사용했다. SNACK 이라는 테이블을 조회한다고 가정을 하는 시나리오로 구성을 했다.



1. SNACK 테이블의 PRICE 열의 값이 500을 초과하는 레코드들을 출력한다.
2. SNACK 테이블의 PRICE 열의 값이 500을 초과하는 레코드의 갯수를 출력한다.
3. SNACK 테이블의 PRICE가 가장 큰 레코드의 NAME 과 PRICE를 출력한다.
4. SNACK 테이블의 모든 레코드를 XML의 형태로 가져온다.


  1. class Program   
  2.     {   
  3.         static void Main(string[] args)   
  4.         {   
  5.             List<Snack> snackList = new List<Snack>()   
  6.             {   
  7.                 new Snack("새우깡""농심", 100, 800),   
  8.                 new Snack("빼빼로","롯데",80, 500),   
  9.                 new Snack("초코파이""오리온", 65, 400),   
  10.                 new Snack("마가렛트""오리온", 30, 800),   
  11.                 new Snack("슈퍼스낵Mark2""네오위즈", 100, 3500),   
  12.                 new Snack("메가 빅곰""해태", 300, 6500)   
  13.             };   
  14.   
  15.             var value =   
  16.                 from snack in snackList   
  17.                 group snack by snack.VendorName into g   
  18.                 select new { VendorName = g.Key, Price = g.Sum(snack => snack.Price) };   
  19.   
  20.             foreach (var s in value)   
  21.             {   
  22.                 Console.WriteLine(s);   
  23.             }   
  24.                
  25.   
  26.             IEnumerable<Snack> query = from snack in snackList where (snack.Price >500) orderby snack.Price descending select snack;   
  27.             Console.WriteLine("<< 500원이 넘는 과자 목록 >>");   
  28.             foreach (Snack s in query)   
  29.             {   
  30.                 Console.WriteLine(s.Name);   
  31.             }   
  32.             Console.WriteLine("500원이 넘는 과자는 총 {0} 가지 입니다.", query.Count());   
  33.             Snack firstSnack = query.First();   
  34.             Console.WriteLine("이중 가장 비싼과자는 {0} 이며, {1} 원입니다.", firstSnack.Name, firstSnack.Price);   
  35.   
  36.             // XML 데이터 형식으로 변경하기   
  37.             Console.WriteLine("==============================================================================");   
  38.             var xmlData = new XElement("스낵목록", from snack in snackList select    
  39.                                                    new XElement("스낵",    
  40.                                                        new XElement("제품명", snack.Name),    
  41.                                                        new XElement("제조사", snack.VendorName),    
  42.                                                        new XElement("중량", snack.Weight),    
  43.                                                        new XElement("가격", snack.Price)));   
  44.             Console.WriteLine(xmlData);   
  45.                
  46.   
  47.         }   
  48.     }  
1. SNACK 테이블의 PRICE 열의 값이 500을 초과하는 레코드들을 출력한다.

-SQL
  1. SELECT  
  2.     name  
  3.     ,vendorname   
  4.     ,weight   
  5.     ,price   
  6. FROM  
  7.     snack   
  8. WHERE  
  9.     price > 500  
-LINQ

  1.   
  2. IEnumerable<Snack> query = from snack in snackList where (snack.Price >500) orderby snack.Price descending select snack;   
  3.   

2. SNACK 테이블의 PRICE 열의 값이 500을 초과하는 레코드의 갯수를 출력한다.

  1. SELECT  
  2.     count(*)   
  3. FROM  
  4.     snack   
  5. WHERE  
  6.     price > 500  

3. SNACK 테이블의 PRICE가 가장 큰 레코드의 NAME 과 PRICE를 출력한다.
4. SNACK 테이블의 모든 레코드를 XML의 형태로 가져온다.

 실제 SQL 문들 보다 코드의 재사용 성이 굉장히 뛰어나다는 걸 볼 수 있었다. 기존에 SQL 문을 작성하는 방법과 비슷한것 같기도 하면서 다른 부분들이 보였다. 이번 LINQ를 공부하면서 혼동되는 부분도 상당히 많았지만.. 특히 이번 세미나를 하면서 느낀점은 뭔가 LINQ를 소개하는 입장에서 타당성까지 설명하게 되어서 LINQ라는 제품을 팔러 온 사람처럼 되어버렸다는 것이다.

 '새로 나온 기술' 에 대해서 설명하려니 수많은 질문을 받게 되었고... 세미나의 본질과는 좀 다르게 흘러갔지만... LINQ를 활용하고 안하고는 개인의 선택이기도 하고.. 또 LINQ를 사용했다고 잘한것도 못한것도 아니니까.. 본인이 느끼기에 적합하다고 느끼는 기술들을 적용해 나가면서 발전적인 소프트웨어를 만드는 것이 가장 합리적이라는 생각이 든다.

LINQ에 대해서 좀 더 많은 정보들을 제공해 줄 수 있는 다른 분이 계셨으면.. 하는 바람이다.