SQL programming 
데이타 읽기 : LINQ 쿼리

데이타를 SQL 서버로부터 읽기 위해서 LINQ to SQL에선 두가지 방식을 사용할 수 있다. 하나는 LINQ 쿼리라 불리는 것으로 C#의 새로운 키워드 select, from, where, orderby, group-by, join 등을 이용하여 마치 SQL문과 비슷하게 데이타를 쿼리하는 것이다. 하지만, 약간의 문법적인 차이는 있다. 예를 들어, 일반 SQL Select문과 다르게 from절이 가장 먼저 나오고 where절과 같은 조건문들이 다음으로 오며, select문이 가장 나중에 온다.

예제






LINQ 쿼리 : where, orderby, select 예제

LINQ 쿼리의 한 예제로서 아래는 Score 테이블중 LastUpdate 필드가 2012-1-1 보다 큰 레코드들을 필터링하고 다시 이를 Id필드 내림차순으로 정렬한 후 레코드를 리턴한는 예이다.

예제





데이타 읽기 : LINQ 메서드 사용

LINQ to SQL에서 데이타를 읽어오는 또 다른 방식으로 LINQ 메서드를 호출하는 방식이 있다. 사실 위의 LINQ 쿼리는 컴파일시 내부적으로 LINQ 메서드로 자동 변경되어 실행된다. LINQ 메소드는 다시 SQL문을 자동 생성하여 SQL 서버에 보내 결과를 받아오게 된다. LINQ 메서드에는 Select, Where, OrderBy 등 상당히 많은 메서드들이 존재하는데, Visual Studio의 IntelliSense 기능과 MSDN의 설명을 참조하면, 쉽게 익힐 수 있다. 참고로 이러한 LINQ 메서드식 표현을 사용하기 위해 람다식(Lambda Expression)을 읽히는 것이 필수적이다) 아래 LINQ 메서드를 이용한 몇가지 예제들을 소개한다.




LINQ 메서드 Where()

Where() 메서드는 SQL의 Where 절과 마찬가지로 테이블 혹은 뷰의 데이타중 특정 조건에 맞는 레코드들만 가져오는데 사용한다. 아래는 Class값이 10인 레코드들을 가져와 출력하는 예이다.

예제





LINQ 메서드 Select()

LINQ Select() 메서드는 특정 필드만 선별하여 가져오거나 중간에 필드들 병합하는 등의 변형을 가할 때 사용한다. 항상 SELECT 문을 써야하는 SQL문과 다르게, LINQ에서는 Row 전체를 리턴할 경우에는 Select() 메서드를 생략할 수 있다. 즉, SQL의 [SELECT * FROM Score WHERE Class=10] 문장은 LINQ에서 [dbConetxt.Scores.Where(p => p.Class==10)]과 같이 Select() 메서드 없이 사용할 수 있다. Select문에서 특정 필드만 부분적으로 리턴하는 경우에는 각별한 주의를 요한다. 만약 리턴 필드가 하나이면 단순히 필드하나를 리턴하면 되지만 (예: Select(p => p.Id);) 복수개의 필드들을 리턴할 경우에는 Select의 람다식 내에서 무명 타입 (Anonymous Type)을 생성해 주어야 한다. 아래 예는 Class가 10인 레코드들 중 Id와 Score필드만을 리턴하는 예이다.





LINQ 메서드 OrderBy()

OrderBy() 메서드는 SQL의 ORDER BY 절과 마찬가지로 테이블 혹은 뷰의 데이타를 정렬하는 함수이다.





LINQ 메서드 Single() vs SingleOrDefault()

리턴될 레코드가 하나일 경우, Single()이나 SingleOrDefault() 메서드를 사용할 수 있다. Single()은 반드시 결과 레코드가 하나일 경우라고 가정하는 것으로 만약 하나가 아니면 무조건 Exception이 발생한다. SingleOrDefault()는 하나일 경우 해당 레코드를 리턴하고, 데이타가 없을 경우는 NULL을 리턴한다. 만약 복수개의 레코드이면 Exception이 발생한다. 일반적으로 많은 LINQ 메소드들은 복수개의 레코드를 리턴하기 때문에 리턴 받은 변수가 컬렉션 타입이다. 따라서 컬렉션안에 하나의 레코드만 있더라도 foreach와 같은 Enumration 루프를 돌려야한다. 이러한 불편함을 없애기 위해 하나의 레코드일 경우 Single() 혹은 SingleOrDefault() 메서드를 많이 사용한다.





본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.