Home Full Site
LINQ Query

LINQ 쿼리는 C#의 새로운 키워드 from, where, orderby, group-by, join, select 등을 이용하여 데이타소스에 대해 쿼리를 실행하는 것이다. LINQ 쿼리는 LINQ to SQL뿐만 아니라 모든 LINQ에 적용되는 것으로 SQL문과 비슷하게 만들어 졌다. 단, 일반 SQL Select문과 다르게 from절이 가장 먼저 나오고 where절과 같은 조건문들이 다음으로 오며, select문이 가장 나중에 온다. 예를 들어, 다음과 같은 LINQ 쿼리 문장은 서울에 사는 모든 회원의 이름을 가져오는 쿼리이다.

var names = from m in Members
    where City=="서울"
    select m.Name;



LINQ to SQL 쿼리 실행

LINQ to SQL에서 각 테이블에 엑세스하기 위해서는 먼저 DataContext 객체를 생성하여야 한다. 이 DataContext는 디폴트로 .dbml을 생성할 때 사용한 파일명을 기준으로 생긴다. 즉, 이전 Chpater에서 처럼 MyDB.dbml을 설정했다면, MyDBDataContext 클래스가 자동 생성된다 (이 이름은 속성에서 변경가능). 일단 DataContext객체를 얻은 후에는 각 테이블들이 그 DataContext 객체의 속성들로 잡히게 되고, Stored Prcoedure/Function은 객체의 메서드로 잡히게 된다. 즉, 아래 예에서 보듯이, MyDBDataContext객체가 db라는 변수에 담길 때, Orders라는 테이블은 db.Orders처럼 엑세스하는 것이다. LINQ 쿼리는 쿼리를 생성했을때 데이타를 가져오지 않고, 실제 foreach문과 같은 문장이 실행되어 Iteration이 일어날때 데이타를 가져오게(fetch) 된다. 아래 예에서 foreach가 첫번째로 실행될 때, 실제 쿼리가 서버로 전달되어 데이타를 가져오는 것이다.

예제

private void button1_Click(object sender, EventArgs e)
{
    // 먼저 DataContext를 만든다
    MyDBDataContext db = new MyDBDataContext();

    // LINQ 쿼리 설정. 쿼리는 아직 실행되지 않는다
    var fransOrders = from ord in db.Orders
                where ord.Customer_ID == "FRANS"
                select ord;

    // 쿼리가 실제 이곳에서 실행되며,
    // 데이타를 가져와 리스트 박스에 넣는다
    foreach (var o in fransOrders)
    {
        listBox1.Items.Add(o.Order_ID + "\t" + o.Order_Date);
    }
}

  • 내부적으로 LINQ to SQL 쿼리는 결국에는 SQL문으로 변환되어 서버를 대상으로 실행된다.


© csharpstudy.com