레이블이 LINQ인 게시물을 표시합니다. 모든 게시물 표시
레이블이 LINQ인 게시물을 표시합니다. 모든 게시물 표시

2012년 8월 29일 수요일

MSDN - 101 LINQ Samples







 모든 LINQ 구문을 다 따라해보기에는 너무 많고 효율도 떨어질 것 같다.
기본적인 구문을 익히고 필요에 따른 Query 가 필요할 때 찾아보면 될 것 같다.







2009년 8월 23일 일요일

교육 Review - LINQ to SQL : LINQ for Connected Database

LINQ to SQL : LINQ for Connected Database







 In-memory collection, xml files, dats set 을 이용한 방법으로 똑같이 SQL Server DB를 이용할 수 있다. LINQ to SQL 은 LINQ project 의 한 부분으로서 Data Base 와 관련된 Object 에 대하여 쿼리, 관리할 수 있다.  LINQ to SQL 은 Data Base Table 과 여러분의 응용프로그램의 domain specific object model 사이의 불일치를 제거하였다. 여러분은 framework 가 여러분의 object 를 탐색하고, 업데이트 하는 동안 자유롭게 object 와 같은 데이터로 작업할 수 있다.

주어진 database 의 객체 모델을 만들기 위하여 클래스는 database entities 에 mapping 되어야 한다. object mapping 을 만드는 방법은 3가지가 있다.
1. 존재하는 객체에 attribute 를 더한다.
2. 자동으로 object 와 mappings 를 생성하기 위하여 지원되는 designer 를 사용한다.
3. command line SQLMetal tool 을 사용한다.





< 예제 만들기 >

1. Adding LINQ to SQL Support
LINQ to SQL 지원을 받기위해선 System.Data.Linq 어셈블리를 참조 시켜야 한다.



코딩의 편의를 위해 다음과 같이 using 선언문을 추가 시킨다.
using System.Data.Linq;
using System.Data.Linq.Mapping; 





2. 사용하려는 DataBase 로의 연결을 생성한다.

서버 탐색기(Server Explorer) 을 연다. 서버 탐색기 트리에 보면 데이터 연결(Data Connections) 노드가 있다. 이곳에 마우스 오른쪽 버튼을 누르면 팝업 메뉴가 나오는데 여기서 연결 추가(Add Connection) 을 선택해 주자.



서버 이름 항목에 콤보 박스를 누르면 연결 할 수 있는 서버 이름이 쫙~ 뜬다. 사용하려는 DB Server 를 선택해 준다.
서버 이름으로 연결 할 수도 있고, 서버의 IP 주소를 직접 입력해도 되는데 IP 주소를 직접 입력하는게 더 정확하다. 해당 서버의 인증 모드를 선택해 주고, SQL Server 인증 사용 이라면 사용자 이름과 암호를 적어준다. 특히, "데이터베이스에 연결" 에서 "데이터베이스 이름 선택 또는 입력" 란에 사용하고자 하는 DB 이름을 적어 주어야 한다. 적지 않는다면 Default 로 master DB 에 연결된다.



성공적으로 연결 되었다면 서버 탐색기에 해당 DB가 보인다.



3. SQL Designer 사용하기

SQL Designer 는 여러분이 Query를 원하는 DataBase 로 부터 table 의 metadata 를 보거나, 설정할 수 있게 해준다. SQL Designer 의 Command Line 버전은 SqlMetal 이라는 tool 이 있다. SqlMetal 은 Vistual Studio 와 .NET Framework 의 구성요소로서 설치된 위치는 %ProgramFiles%\Microsoft SDKs\Windows\v6.0A\bin 이다.


솔루션 탐색기(Solution Explorer) 에서 " 추가 → 클래스 " 를 선택한다.



"데이터" 항목에서 "LINQ to SQL 클래스" 를 선택한다.



이것이 " SQL Designer " 이다.



솔루션 탐색기에 몇가지 변화가 생기는데
- DataClasses1.dbml 파일이 프로젝트에 추가 된다. 또한 그 하위에 DataClasses1.dbml.layout 과
   DataClasses1.designer.cs 파일이 추가 된다.
- SQL Designer 에 원하는 Table 을 드래그 앤 드롭 하면 Object Releation Mapping(ORM) 이 생성된다. ORM
  은 Database 의 해당 Table 과 해당 Table 클래스 사이를 연결시켜 주며 SQL Designer 가 생성시켜 주고,
  DataClasses1.designer.cs 파일에 위치하게 된다. 이 객체는 entity class 라고 불리며, 연결시킨 Table 을 마치
  프로젝트 안의 객체를 사용 하듯이 data 와 field 에 접근할 수 있도록 해준다.
- 또한 DataClasses1.desinger.cs 파일안에 DataContext 객체가 생성된다. 이 클래스는 연결시킨 Table 의 data
   와 field 에 쉽게 접근할 수 있게 해주며, 자동적으로 database 에 접근할 수 있게 해준다.
- app.config 파일이 프로젝트에 추가된다. 이 파일은 해당 database 를 위한 자동적으로 생성된 ConnectionString
   이 포함되어 있다.

위와 같은 것들은 2가지 장점을 제공해 준다.
- database 에 자동적으로 연결할 수 있게 도와준다.
- 이것은 마치 프로젝트의 포함된 객체인 것 처럼 database table 에 접근할 수 있게 도와준다.




서버 탐색기에서 사용하려고하는 DB Table 을 마우스 왼쪽 버튼으로 SQL Designer 로 드래그 앤 드롭을 한다.
해당 테이블의 디자인을 볼 수 있다.





4. LINQ 사용 예
DataClasses1DataContext db = new DataClasses1DataContext();
db.Log = Console.Out;
var query = from c in db.tbOrgChart
                  where c.DEPTH == 3
                  select c;
            
dataGridView1.DataSource = query.ToList();






5. 출력 예









cf) Connect to a SQL Database and Use the LINQ to SQL Designer
http://blogs.msdn.com/charlie/archive/2007/11/19/connect-to-a-sql-database-and-use-the-sql-designer.aspx

2009년 8월 22일 토요일

교육 Review - LINQ to DataSet : LINQ for DataSet Objects

LINQ to DataSet : LINQ for DataSet Objects






 DataSet 은 ADO.NET programming model 의 key element 이다. ADO.NET 에서 데이터베이스는 DataSet 클래스로 표현한다. DataSet 은 이름 그대로 데이터의 집합이며 테이블과 관계, 그 외 관리에 필요한 여러 가지 정보들로 구성된다. DataSet 은 ADO.NET의 주요 특징이라 할 수 있는 비연결 구조의 핵심이다. DataSet 은 메모리 내에 구현된 완벽한 데이터베이스이며 서버의 DB 전체에 대한 사본을 DataSet 객체 하나로 생성할 수 있다. 따라서 서버와 연결되지 않은 상태에서도 데이터를 검색하고 조작할 수 있는 것이다.

LINQ to DataSet 역시 In-Memory Collection 과 XML 문서를 쿼리한 방법을 동일하게 적용할 수 있다.






※ 실습 준비

1. SQL 2000 Samples DBDB 테스트 할려면 DB가 있어야 하는데... 이건 MS에서 제공하는 무료 DB 이다.
http://www.microsoft.com/Downloads/details.aspx?FamilyID=06616212-0356-46a0-8da2-eebc53a68034&displaylang=en
cfile27.uf.1646B93C50AEC26C20F509.msi


설치시 특별하게 설정할 건 없다. 설치된 디렉토리의 경로는 C:\SQL Server 2000 Sample Databases 이다.


2. SQL Server2005 SSMSEE 설치
MS 다운로드 페이지의 설명을 빌리자면
" SSMSE(Microsoft SQL Server Management Studio Express)는 SQL Server 2005 Express Edition 및 SQL Server 2005 Express Edition with Advanced Services를 관리할 수 있는 사용이 용이한 무료 그래픽 관리 도구입니다. "
http://www.microsoft.com/downloads/details.aspx?FamilyID=6053c6f8-82c8-479c-b25b-9aca13141c9e&DisplayLang=ko



역시 특별히 설정해줄것은 없다. 역시 무료라...





< 프로그램 로드 시 DataSet 객체 생성 >
DataSet dataSet;
dataSet = new DataSet("Customers");




< DataSet 의 데이터 출력 >
SqlConnection con = new SqlConnection();
con.ConnectionString = @"Data Source=.\sqlexpress;Initial Catalog=Northwind;Integrated Security=True";

SqlDataAdapter adt = new SqlDataAdapter("select * from Customers", con);
adt.Fill(dataSet);
dataGridView1.DataSource = dataSet.Tables[0];







< LINQ 를 사용한 데이터 출력 >
var query = from ord in dataSet.Tables[0].AsEnumerable()
                  where ord.Field("City") == textBox1.Text
                  select ord;
          
dataGridView1.DataSource = query.AsDataView();







< 소스 코드 >
cfile24.uf.0313B64050AEC26E0EFB5B.zip






이미지 출처 : FreeM Consulting Group.
http://www.msstudy.co.kr

2009년 8월 20일 목요일

교육 Review - LINQ to XML : LINQ for XML documents

LINQ to XML : LINQ for XML documents






LINQ to XML 은 새로운 XML DOM 이다. 새로운  XML DOM 은 standard query operators 를 이용하고, XML document 와 XML 조각을 만들기 위한 간단한 방법을 제공해 준다.

※ LINQ to XML 에서 알아야 할 것은 다음과 같다.
1. XDocument object 안에서 XML document 를 읽는 방법
2. object 로 부터 element 들을 쿼리하는 방법
3. scratch 로 부터 document 와 element 를 생성하는 방법

Namespace
LINQ to XML 은 System.Xml.Linq 를 참조해야 한다.
using System.Xml.Linq





< 예제 >

테스트할 XML 파일

 
 
 
 
 
 
 
 




XML 파일로 부터 읽은 데이터를 저장할 클래스를 정의 한다.
namespace LINQtoXML
{
    public class Customer
    {
        public string CustomerID { get; set; }
        public string City { get; set; }

        public override string ToString()
        {
            return CustomerID + "\t" + City;
        }
    }
}




XML 파일을 읽어 출력


var results = CreateXMLCustomers();
dataGridView1.DataSource = results.ToList();


코드를 보면 알 수 있듯이 LINQ 는 Generic Collection 을 사용한다. XDocument 클래스를 사용하여 XML 파일을 읽는다. Load 메소드의 인수로 XML 파일의 경로를 주면 되는데, 디폴트로는 현재 실행 파일의 위치이다. XML 파일의 내용을 제네릭 클래스에 넣어야 하기 때문에 XML 파일에서 City 와 CustomerID 값을 사용하여 새로운 Customer 객체를 생성해서 제네릭 클래스에 넣어 주었다.







City 가 London 인 사람만 출력
var results = from c in CreateXMLCustomers()
                   where c.City == "London"
                   select c;
dataGridView1.DataSource = results.ToList();





 여기서 중요한 점은 LINQ to Object 를 사용한 예제와 비교했을 때 쿼리문은 동일하다는 것이다.


< 소스 코드 >
cfile25.uf.15189F3850AEC25D27DF14.zip





위의 방법은 XML 데이터를 사용자 정의 클래스를 생성하여 컬렉션으로 만든 다음에 LINQ 를 이용한 것이다. 이 방법 외에 사용자 정의 클래스를 만들지 않고 직접 XML 문서를 쿼리하고, 또한 결과를 XML 문서를 만드는 방법이 있다. 아래 소스를 참조.

/**
@brief XDocument, XElement을 이용한 XML 직접 쿼리
@note  Load 메소드는 XDocument 클래스 타입을 리턴하며, XML 데이터 내용을 그대로 갖는다.
@note  XDoment 객체를 LINQ 쿼리 결과 XElement<> 제네릭 컬렉션 객체를 얻게 된다.
           하나의 XElement 는 하나의 레코드를 표현한다.
@note  XML 을 쿼리할 때, XML 데이터를 담을 클래스를 미리 생성하여, 그 클래스를 쿼리
           할 수도 있고, 이와 같이 직접 XML 데이터를 쿼리할 수도 있다.
*/        
private void XMLQuery()
{
    var doc = XDocument.Load("Customers.xml");
    var results = from c in doc.Descendants("Customer")
                       where c.Attribute("City").Value == "London"
                       select c;

     // dataGridView 에 출력
     DataTable tblCustomers = new DataTable("tblCustomers");
     dataGridView1.DataSource = tblCustomers;

     DataColumn col = new DataColumn("CustomerID", typeof(string));
     col.MaxLength = 10;
     col.AllowDBNull = false;
     col.Unique = true;
     tblCustomers.Columns.Add(col);
     tblCustomers.PrimaryKey = new DataColumn[] { col };

     col = new DataColumn("City", typeof(string));
     col.AllowDBNull = false;
     tblCustomers.Columns.Add(col);

     DataRow row;
     foreach (var contact in results)
     {
         row = tblCustomers.NewRow();
         row["CustomerID"] = contact.Attribute("CustomerID").Value;
         row["City"] = contact.Attribute("City").Value;
         tblCustomers.Rows.Add(row);
      }

      // 쿼리 결과로 새로운 XML 파일 생성
      XElement transformedResults = 
                    new XElement("Londoners", from customer in results
                                  select new XElement("Contact",
                                               new XAttribute("ID", customer.Attribute("CustomerID").Value),
                                               new XElement("Name", customer.Attribute("ContactName").Value),
                                               new XElement("City", customer.Attribute("City").Value)));
     transformedResults.Save("Output.xml");
}


< 소스 코드 >
cfile1.uf.1123A33A50AEC25E1F5944.zip





2009년 8월 19일 수요일

교육 Review - LINQ to Object : LINQ for In-Memory Collections

 LINQ to Object : LINQ for In-Memory Collections






LINQ를 사용하여 In-Memory Collection 에 대하여 데이터를 다룰 수 있다.






< 예제 >

제네릭 컬렉션 타입으로 사용할 클래스를 정의 한다. Customer 클래스로 다음과 같다.
namespace LINQOverView
{
    public class Customer
    {
        public string CustomerID { get; set; }
        public string City { get; set; }

        public override string ToString()
        {
            return CustomerID + "\t" + City;
        }
    }
}


Customer 클래스 타입을 사용하여 제네릭 컬렉션을 생성한다.
public IEnumerable CreateCustomers()
{
    return new List
    {
        new Customer { CustomerID = "ALFKI", City = "Berlin"    },
        new Customer { CustomerID = "BONAP", City = "Marseille" },
        new Customer { CustomerID = "CONSH", City = "London"    },
        new Customer { CustomerID = "EASTC", City = "London"    },
        new Customer { CustomerID = "FRANS", City = "Torino"    },
        new Customer { CustomerID = "LONEP", City = "Portland"  },
        new Customer { CustomerID = "NORTS", City = "London"    },
        new Customer { CustomerID = "THEBI", City = "Portland"  }
    };
}



제네릭 컬렉션 객체로 부터 모든 데이터를 읽어서 출력한다.
var results = CreateCustomers();
dataGridView1.DataSource = results.ToList();







제네릭 컬렉션 객체 데이터 중에서 City 가 London 인 사람만 출력한다.
var results = from c in CreateCustomers()
                   where c.City == "London"
                   select c;

dataGridView1.DataSource = results.ToList();







< About >
우선 관리할 데이터 정보를 담고 있는 클래스를 만들었다. 고객의 ID와  사는 도시 정보를 담고 있는  Customer 클래스 이다. 나중에 출력용으로 ToString 메소드를 재정의 하여 고객의 ID 와 도시 정보를 string 으로 출력하게 하였다.

Main 함수에서 ObjectQuery 메소드를 호출하게 되는데, ObjectQuery 메소드는 객체(즉, Collection)를 쿼리하는 메소드 이다. CreateCustomers 메소드는 고객들 각각을 Customer 객체로 생성하고, List<Customer> 제네릭 컬렉션에 담아 리턴한다. 여기서 유용하게 쓰인 문법은 "컬렉션 Initializer" 이다. 제네릭 컬렉션은 모두 IEnumerable<>를 상속받으로로 IEnumerable<> 타입으로 리턴하였다.

사용된 LINQ는 select 문으로 CreateCustomers 메소드가 리턴한 컬렉션에 대하여 도시 정보가 "London" 인 정보만 컬렉션으로 뽑았다. 뽑은 컬렉션을 순환하여 출력 하였다.
순환문은 다음과 같이 작성하여도 된다.

IEnumerator ie =  ht.Values.GetEnumerator();
while(ie.MoveNext())
{
    Button b = (Button)ie.Current;
    b.BackColor = Color.Blue;
}



< 소스 코드 >

cfile25.uf.17760F3850AEC25A2AE535.zip






이미지 출처 : FreeM Consulting Group.
http://www.msstudy.co.kr

2009년 8월 18일 화요일

교육 Review - C# 3.0 과 LINQ

C# 3.0 과 LINQ



 

C# 3.0 은 C# 2.0 의 성능을 향상 시켰다. LINQ 기술을 사용할 수 있는 문법을 지원하며, C# 2.0 의 기술을 C# 3.0 에서 그대로 사용할 수 있다.








C# 3.0 에 많은 부분이 추가되었다. 그 중에서도 위와 같은 특징들은 LINQ 를 잘 활용하기 위해 추가되었다고 할 수 있다. 위와 같은 기술들이 기존 기술들 보다는 LINQ 를 사용할 때 많이 사용되어 진다.








LINQ 의 쿼리는 대상이 컬렉션으로만 만들 수 있다면 어떤 대상이라도 가능 하다. 즉, 모든 컬렉션에 대해 쿼리 작업을 진행한다. 따라서 대상이 무엇이든 동일한 쿼리문을 사용한다.  프로그래밍 언어와 통합 했다는 뜻은 기존에는 쿼리문을 문자열 형태로 날리기 때문에 컴파일 타임때는 쿼리문의 잘잘못을 따질 수 없지만, LINQ 는 쿼리문 자체가 언어의 문법이므로 컴파일 타임에 잘못된 쿼리문을 판별할 수 있다. 따라서 개발 효율성이 높다. 쿼리문 작성 시 Visual Studio 인텔리센스가 도움을 주기 때문에 쉽게 작성할 수 있다.

1. LINQ APIs 는 Visual Studio 의 IntelliSense 의 도움을 받는다.
2. 쿼리문을 문자열로 작성할 필요 없이, 직접 LINQ 쿼리문을 이용하며, 이는 컴파일 타임에 검사된다.








.NET LINQ 를 이용할 수 있는 언어는 현재(2009년 08월) C#3.0, VB.NET 9.0 뿐이다. 앞으로 더 늘어날 것이라고 한다. 이런 언어들을 통하여 LINQ 를 사용하는데 쿼리 대상에 따라 크게는 3가지로 나눌 수 있다.

Object 를 대상을로 하는 LINQ to Object
RDB를 대상으로 하는 LINQ to ADO.NET (LINQ to DataSets, LINQ to SQL, LINQ to Entities)
XML을 대상으로 하는 LINQto XML

분류를 나눠 놓기는 했지만 LINQ 사용법은 동일하다.









자료 출처 : FreeM Consulting Group.
http://www.msstudy.co.kr