Home Full Site
LINQ 메서드식 표현

이전 Chapeter에서 본 LINQ Query (from...select)는 SQL문법과 비슷한 C# 문법을 제공한다는 점에서 많은 편리함을 제공하지만, 실제 .NET CLR에서는 이러한 쿼리들이 메서드 형태로 호출되어야 하므로, 이러한 쿼리들은 C# 컴파일시에 내부적으로 확장메서드(Extension Method)로 변경되어진다. 많은 확장메서드들중 몇가지 잘 쓰이는 메서드를 아래에 열거하였다 (MSDN의 Enumerable Methods 참조).
아래 예제는 쿼리식 표현을 메서드식 표현으로 변경해 본 예이다. Where() 메서드 안에 있는 표현은 람다식(Lambda Expression)으로서 LINQ에서 많이 사용된다.


예제

// 쿼리식 표현
var v = from ord in db.Orders                              
        where ord.Customer_ID == "FRANS"
        orderby ord.Order_Date ascending
        select ord;

// 메서드식 표현1
var v = db.Orders.Where(order => order.Customer_ID == "FRANS").Select(o => o);

// 메서드식 표현2
// 위의 메서드식 표현1의 Select()메서드는 동일데이타를
// 변형없이 리턴하므로 생략가능
var v = db.Orders.Where(order => order.Customer_ID == "FRANS");




LINQ to SQL : 단일 레코드 리턴

LINQ에서 사용되는 많은 Extension Method들중 단일 레코드를 리턴하는 메서드가 있다. Single() 혹은 SingleOrDefault()라는 메서드인데, 이는 데이타가 하나라는 전제하에 사용된다. 만약 여러 Row를 리턴하면 에러가 발생한다. Single()은 데이타가 반드시 1개 존재하며, 그럴지 않을 경우 Exception을 발생시킬 때 쓰는 메서드이고, SingleOrDefault()는 데이타가 1개 일때는 해당 데이타를 데이타가 없을 경우는 해당 Type의 디폴트 값 (일반적으로 NULL)을 리턴할 때 사용된다. 일반적으로 SingleOrDefault()를 사용하여 NULL을 체크하는 방식을 자주 사용한다.

예제

var v = db.Orders.Where(o => o.Order_ID == 10001).SingleOrDefault();
if (v != null)
{
    txtDate.Text = v.Order_Date.ToString();
}



LINQ to SQL : 처음 레코드 리턴

만약 조건식에 맞는 처음 레코드를 찾는 경우, First() 혹은 FirstOrDefault()라는 메서드를 사용한다. 이는 데이타가 여러 개 리턴될 경우도 사용할 수 있으며, 그 중 처음 레코드만을 리턴한다.

var v = db.Orders.Where(o => o.Customer_ID == "FRANS").FirstOrDefault();



LINQ to SQL : OrderBy

데이타를 올림차순 내림차순으로 정의하기 위해서는 OrderBy() 메서드를 사용한다. OrderBy()는 기본적으로 올림차순으로 정렬하며, 만약 내림차순이나 다른 비교 연산을 사용하려면, IComparer를 구현하는 클래스를 만들어 파라미터로 지정한다.

예제

// 주문날짜 올림차순으로 정렬
var v = db.Orders.Where(o => o.Customer_ID == "FRANS").OrderBy(p => p.Order_Date);
foreach (var o in v)
{
    listBox1.Items.Add(o.Order_ID);
}



LINQ to SQL : Select() 메서드

Select() 메서드는 데이타를 변형하거나 부분 선택하여 새로운 클래스(Anonymous Type)를 만들어 리턴하고 싶은 때 사용한다. 아래 예제는 전체 Order레코드 중 일부 필드들을 선별 변형하여 새로운 익명 타입을 만든 예이다.

예제

// Select() 메서드를 이용해
// Anonymous Type을 새로 정의

var v = db.Orders.Where(o => o.Customer_ID == "FRANS").Select(p => new { Id = p.Order_ID,  Addr = p.Ship_Address + " " + p.Ship_City });
foreach (var o in v)
{
    listBox1.Items.Add(o.Id + ":" + o.Addr);
}



© csharpstudy.com