38. C# LYNQ란(링크), 닷넷LYNQ, WHERE, ORDERBY, IEnumerable
LYNQ(Language Integrated Query, 링크)는 C#에 통합된 데이터 질의 기능을 이야기 한다. 일반적으로 데이터베이스의 데이터를 질의하기 위해 Structured Query Language(SQL)을 사용하지만 이는 DB의 데이터를 다루기 위한 질의어로 객체(컬렉션)를 질의할 수 있는 LYNQ와는 다르다.
LINQ가 쿼리, 질의할 수 있는 데이터 소스는 상당히 광범위하며, 그 중 .NET Framework4에서 기본적으로 제공하는 대상은 컬렉션 형태를 가지는 object와 DataSet, 그리고 관계형 데이터베이스인 SQL 서버와 XML 파일 등 이다.
LYNQ는 표준 쿼리 연산자를 통해 사용되며 문법이 SQL과 비슷한 쿼리 기반 표현식 과 이를 확장 메소드로 구현하여 제공하는 메소드 기반 쿼리가 포함된다.
1. LYNC 기본
FROM
모든 LYNQ 쿼리식은 반드시 FROM절로 시작하는데 데이터원본의 데이터를 나타내는 범위 변수를 FROM절에 기술해야 한다. 데이터원본 형식은 자유로우며 IEnumerable<T> 인터페이스를 상속하는 형식이어야 한다. 그러므로 배열이나 컬렉션 객체들은 FROM절에 올 수 있다. 범위변수는 쿼리변수라고도 하는데 foreach의 반복변수 정도로 보면 된다. Foreach 반복변수와 범위변수가 다른 점은 반복변수가 원본으로부터 데이터를 담고 있지만 범위변수는 데이터를 담고 있지는 않다. 그러므로 쿼리식 외부에서 선언된 변수에 범위변수의 데이터를 복사할 수는 없다. 범위변수는 오로지 LINQ 질의 안에서만 통용된다.
LYNQ에서 사용되는 쿼리 식은 from 절로 시작하여 select 또는 group 절로 끝나야 한다. 첫 번째 from 절과 마지막 select 또는 group 절 사이에는 where, orderby, join, let 및 추가 from 절과 같은 선택적 절 중 하나 이상이 포함될 수 있으며 into 키워드를 사용하여 join 또는 group 절의 결과를 같은 쿼리 식에 있는 다른 쿼리 절의 소스로 사용할 수 있다.
WHERE
필터역할을 하는 연산자, FROM절의 범위변수가 가져야 하는 조건을 where 연산자에 매개변수로 입력하면 LYNQ는 해당 조건에 맞는 데이터만 걸러낸다.
ORDERBY
데이터 정렬을 수행하는 연산자
SELECT
최종 결과를 추출하는 쿼리식의 마침표.
[예제 1 : 배열에서 홀수 값 오름차순, 3보가 큰수 내림차순 추출]
using System;
using System.Linq;
namespace from
{
class Onj
{
static void Main(string[] args)
{
int[] num = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var onjQuery1 = from n in num
where n % 2 == 1
orderby n
select n;
foreach (int i in onjQuery1)
Console.WriteLine("홀수 : {0}", i);
// Query __EXPRESSION__.
IEnumerable<int> onjQuery2 = //query variable
from n in num //데이터소스 및 범위변수(필수)
where n > 3 // 생략가능
orderby n descending // 내림차순정렬(생략가능)
select n; //select or group으로 끝나야 한다.
foreach (int i in onjQuery2)
{
Console.WriteLine(i);
}
}
}
}
[결과]
홀수 : 1
홀수 : 3
홀수 : 5
홀수 : 7
홀수 : 9
10
9
8
7
6
5
4
LYNQ질의 결과는 IEnumerable<T> 형태로 반환되는데 형식매개변수 T는 쿼리식의 select문에 의해 결정된다. 위 뭐리식의 결과 select n은 int형 이므로 IEnumerable<int>가 리턴된다.
[예제 2]
using System;
using System.Linq;
using System.Collections.Generic;
namespace from
{
class OnjProfile
{
public string Name { get; set; }
public string Url { get; set; }
public int Age { get; set; }
}
class Onj
{
static void Main(string[] args)
{
int[] scores = { 70, 99, 59, 88, 81, 97 };
//최고점수
int maxScore = (
from score in scores
select score
).Max();
Console.WriteLine("최고점수 : {0}", maxScore);
//아래처럼 뭐리식을 분리해도 된다.
IEnumerable<int> scoreQuery = from score in scores
select score;
int lowScore = scoreQuery.Min();
Console.WriteLine("최소점수 : {0}", lowScore);
OnjProfile[] onjProfile = {
new OnjProfile() {Name="ONJSYSTEM", Url="onjsystems.co.kr", Age=7},
new OnjProfile() {Name="오라클자바커뮤니티프로그래밍실무학원", Url="oraclejavacommunity.com", Age=6},
new OnjProfile() {Name="오라클자바커뮤니티", Url="oraclejavanew.kr", Age=16}
};
var onjs = from onj in onjProfile
where onj.Name.Contains("오")
orderby onj.Age
select new
{
Name = onj.Name,
Url = onj.Url,
Age = onj.Age
};
foreach (var o in onjs)
Console.WriteLine("{0}, {1}, {2}", o.Name, o.Url, o.Age);
}
}
}
[결과]
최고점수 : 99
최소점수 : 59
오라클자바커뮤니티프로그래밍실무학원, oraclejavacommunity.com, 6
오라클자바커뮤니티, oraclejavanew.kr, 16
[100%환급,개발자전문]빅데이터/SQL/자바/스프링/안드로이드/닷… | 12-27 | 2554 | ||
[채용확정무료교육]오라클자바개발잘하는신입뽑기2개월과정,교육… | 12-11 | 1863 | ||
53 | [평일100%환급7건]Spring,자바&JSP,안드로이드,웹퍼블리싱,C#닷… | 03-15 | 1674 | |
52 | [주말]C#,ASP.NET마스터 | 01-31 | 1768 | |
51 | [기업100%환급,평일주간]SQL기초에서스키마오브젝트,PLSQL,힌트… | 01-31 | 2543 | |
50 | [평일주간야간,주말]C기본&자료구조,알고리즘 | 01-31 | 1402 | |
49 | [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정-… | 01-19 | 1710 | |
48 | [평일야간,주말]안드로이드개발자과정(Android기초실무) | 01-11 | 1592 | |
47 | [평일야간,주말주간야간]JAVA,Network&JSP&Spring,MyBatis,Hiber… | 01-03 | 2109 | |
46 | [100%환급,개발자전문]빅데이터/SQL/자바/스프링/안드로이드/닷… | 12-27 | 2554 | |
45 | [평일주간]NoSQL,MongoDB,빅데이터기초과정 | 12-19 | 1820 | |
44 | [평일주간야간, 주말]웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX… | 12-14 | 1803 | |
43 | [채용확정무료교육]오라클자바개발잘하는신입뽑기2개월과정,교육… | 12-11 | 1863 | |
42 | [평일주간]빅데이터하둡기초과정(BigData Hadoop) | 12-09 | 1462 | |
41 | [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 | 12-01 | 1689 | |
40 | [기업100%환급]오라클&자바웹스프링신입과정3주(SQL,JAVA,JSP,Se… | 12-01 | 1862 | |
39 | [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) | 12-01 | 1338 |
댓글 없음:
댓글 쓰기