대부분의 애플리케이션은 데이터 중심이지만 대부분의 데이터 웨어하우스는 관계형 데이터베이스입니다. 수년에 걸쳐 디자이너와 개발자는 개체 모델을 기반으로 애플리케이션을 디자인해 왔습니다.
개체는 데이터 액세스 계층(DAL)이라고 하는 데이터에 액세스하는 구성 요소를 연결하는 역할을 담당합니다. 여기서 우리는 세 가지 점을 고려해야 합니다.
애플리케이션에 필요한 모든 데이터를 단일 리소스에 저장할 필요는 없습니다. 이 자원은 관계형 데이터베이스, 비즈니스 객체, XML 파일 또는 웹 서버일 수 있습니다.
메모리의 개체에 액세스하는 것은 데이터베이스 및 XML 파일의 데이터에 액세스하는 것보다 간단하고 저렴합니다.
접근된 데이터는 직접적으로 사용되지 않고 덤프, 정렬, 그룹화, 수정 등의 작업을 수행합니다.
따라서 단 몇 줄의 코드만으로 모든 종류의 데이터를 쉽게 통합할 수 있는 도구, 즉 다양한 소스의 데이터를 통합하고 기본적인 데이터 작업을 수행할 수 있는 도구가 있다면 매우 유용할 것입니다.
LINQ(Language Integrated Query)는 그러한 도구 중 하나입니다. LINQ는 .NET Framework 3.5의 확장이며 해당 관리 언어는 쿼리를 개체에 더 가깝게 만듭니다. 이는 관용적 구문을 사용하여 다양한 유형의 데이터 검색을 완료할 수 있는 공통 구문과 프로그램 모델을 정의합니다.
검색, 프로젝트, 링크, 그룹, 파티션, 집합 작업 등과 같은 관련 작업을 LINQ에서 사용할 수 있으며 .NET Framework 3.5의 C# 및 VB 컴파일러는 LINQ 구문을 지원하므로 별도의 작업을 수행하지 않고도 구성 데이터를 저장할 수 있습니다. ADO.NET.
예를 들어 C#에서 LINQ를 사용하여 Northwind 데이터베이스의 Consumers 테이블을 쿼리하려면 코드는 다음과 같아야 합니다.
var data = from c in dataContext.Customerswhere c.Country == "스페인"select c;
안에:
from 키워드는 논리적으로 각 컬렉션을 순서대로 통과합니다.
where 키워드가 포함된 표현식은 컬렉션의 각 개체를 비교합니다.
select 문은 비교된 개체를 선택하여 목록에 추가하고 반환합니다.
변수 선언에는 var 키워드가 사용됩니다. 반환된 객체의 정확한 유형이 불분명하기 때문에 정보를 동적으로 추론해야 함을 나타냅니다.
LINQ 쿼리 문은 IEnumerable에서 상속되는 모든 데이터 지원 클래스에 적용될 수 있습니다. 여기서 T는 List<Book>과 같은 모든 데이터 형식일 수 있습니다.
개념을 이해하기 위해 예를 살펴보겠습니다. 예제에서는 다음 클래스가 사용되었습니다. Book.cs
공개 클래스 도서{ 공개 문자열 ID { 가져오기; 설정; } 공개 소수점 가격 설정 } 공개 정적 목록<책> GetBooks(); List<도서> list = new List<도서>(); list.Add(new Books { ID = "001", Title = "C# 프로그래밍", 가격 = 634.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "002", Title = "30일 안에 Jave 배우기", 가격 = 250.76m, DateOfRelease = Convert.ToDateTime ("2011-08-15") }); list.Add(새 도서 { ID = "003", 제목 = "ASP.Net 4.0 프로그래밍", 가격 = 700.00m, DateOfRelease = Convert.ToDateTime("2011-02-05") }) list.Add(new Books { ID = "004", 제목 = "VB.Net이 쉬워졌습니다", 가격 = 500.99m, DateOfRelease = Convert.ToDateTime("2011-12-31") }); list.Add(new Books { ID = "005", Title = "C 프로그래밍", 가격 = 314.76m, DateOfRelease = Convert.ToDateTime("2010- 02-05") }); list.Add(new Books { ID = "006", Title = "Programming in C++", 가격 = 456.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "007", 제목 = "Datebase 개발", 가격 = 1000.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); 목록; }}
웹 페이지에서 이 클래스를 사용하여 책 제목을 표시하는 간단한 레이블 컨트롤을 갖습니다. Page_Load 메서드는 책 목록을 만들고 LINQ 쿼리를 사용하여 제목을 반환합니다.
public 부분 클래스 simplequery : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { List<Books> books = Books.GetBooks(); from b in books select b.Title foreach; 책 제목의 var 제목) lblbooks.Text += String.Format("{0} <br />", title);
웹페이지가 실행되면 태그에 쿼리 결과가 표시됩니다.
위의 LINQ 표현식은 다음과 같습니다.
var booktitles = 책의 b에서 b.Title을 선택합니다.
다음 SQL 문과 동일합니다.
책에서 제목 선택
지금까지 사용된 연산자 외에도 쿼리 절을 실행하는 연산자가 많이 있습니다. 몇 가지 연산자와 절을 살펴보겠습니다.
SQL의 '조인 절'은 두 개의 데이터 테이블을 조인하고 두 데이터 테이블에 나타나는 열에 데이터 모음을 표시하는 데 사용됩니다. LINQ는 이 기능을 지원할 수도 있습니다. 이를 확인하려면 Saledetails.cs라는 다른 클래스를 이전 프로젝트에 추가합니다.
공개 클래스 Salesdetails{ 공개 int 판매 { get; } 공개 문자열 ID {get; set;} 공개 정적 IEnumerable<Salesdetails> getalesdetails() { ID = "001", 페이지=678, 매출 = 110000}, new Salesdetails { ID = "002", 페이지=789, 매출 = 60000}, 새로운 Salesdetails { ID = "003", 페이지=456, 매출 = 40000}, 새로운 Salesdetails { ID = "004", 페이지=900, 매출 = 80000}, 새로운 Salesdetails { ID = "005", 페이지=456, 매출 = 90000}, 새 Salesdetails { ID = "006", 페이지=870, 매출 = 50000}, new Salesdetails { ID = "007", 페이지=675, 매출 = 40000}, } return sd.OfType<Salesdetails>();
Page_Load 함수에 코드를 추가하여 조인 절 처리를 사용하여 두 테이블에 대한 쿼리를 완료합니다.
protected void Page_Load(object sender, EventArgs e){ IEnumerable<Books> books = Books.GetBooks(); IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails(); from b in books 조인 s on b.ID s.ID와 같음 select new { Name = b.Title, Pages = s.pages }(var title in) 책 제목) lblbooks.Text += String.Format("{0} <br />", title);}
결과 페이지는 다음과 같이 표시됩니다.
where 절을 사용하면 필터링 조건을 쿼리에 추가할 수 있습니다. 예를 들어, 500페이지가 넘는 참고문헌을 가져오려면 Page_Load 메서드의 핸들을 다음과 같이 변경할 수 있습니다.
var booktitles = from b in books는 b.ID가 s.ID와 동일한 판매에서 s를 조인합니다. 여기서 s.pages > 500은 new { Name = b.Title, Pages = s.pages }를 선택합니다.
쿼리 문은 페이지 수가 500보다 큰 열만 반환합니다.
이러한 절을 사용하면 쿼리 결과를 정렬할 수 있습니다. 제목, 페이지 번호, 도서 가격을 쿼리하고 가격별로 정렬하려면 Page_Load 메서드 핸들에 다음 코드를 작성합니다.
var booktitles = from b in books Join s in sales on b.ID는 s.ID orderby b.Price select new { Name = b.Title, Pages = s.pages, Price = b.Price};
반환된 튜플은 다음과 같습니다:
let 절을 사용하면 변수를 정의하고 데이터에서 계산된 값을 변수에 할당할 수 있습니다. 예를 들어 위의 두 판매 값에서 총 판매 값을 계산하려면 다음과 같이 계산해야 합니다.
TotalSale = 도서 가격 * 판매량
이 수식을 완성하려면 Page_Load 메서드의 핸들에 다음 코드 조각을 추가합니다.
let 절을 사용하면 변수를 정의하고 데이터에서 계산된 값을 변수에 할당할 수 있습니다. 예를 들어 위의 두 판매 값에서 총 판매 값을 계산하려면 다음과 같이 계산해야 합니다.
var booktitles = from b in book Join s in sales on b.ID = s.ID let totalprofit = (b.Price * s.sales) select new { Name = b.Title, TotalSale = totalprofit};
쿼리 결과는 아래와 같습니다.