C# LINQ(링크)Linq To DataSet(데이터셋/데이터테이블과링크)
C# LINQ(링크)Linq To DataSet(데이터셋/데이터테이블과링크)
IEnumerable<T> 제네릭 인터페이스를 구현한 데이터 소스는 LINQ을 통해 쿼리할 수 있으므로
DataSet의 DataTable에 대해 AsEnumerable을 호출하면 LINQ to DataSet 쿼리의 데이터 소스 역할을 하는 제네릭 IEnumerable<T> 인터페이스를 구현한 개체가 반환되므로 Linq 쿼리식에서 이용할 수 있다.
LINQ to DataSet 쿼리 역시 쿼리 식 구문과 메서드 기반 쿼리 구문이라는 두 가지 구문 형식으로 만들 수 있다.
- 쿼리 식 구문
쿼리 식은 선언적 쿼리 구문으로 이 구문을 사용하면 C#에서 SQL에서와 비슷한 형식으로 쿼리를 작성할 수 있다.
- 메서드 기반 쿼리 구문
LINQ to DataSet 쿼리를 작성하는 데 메서드 기반 쿼리를 사용할 수도 있다.
메서드 기반 쿼리 구문은 메소드 형태에 람다 식을 매개 변수로 전달하는 방법이다.
using System;
using System.Data;
using System.Collections;
using System.Linq;
class LinqToDataSet
{
static void Main()
{
//CUSTOMER 데이터 생성
DataTable customer_dt = new DataTable("customer");
DataColumn col1 = new DataColumn();
DataColumn col2 = new DataColumn();
DataColumn col3 = new DataColumn();
DataColumn col4 = new DataColumn();
col1.DataType = System.Type.GetType("System.Int16");
col1.ReadOnly = true; col1.AllowDBNull = false; col1.Unique = true;
col1.ColumnName = "ID"; col1.AutoIncrement = true; col1.AutoIncrementSeed = 1;
col2.DataType = System.Type.GetType("System.String");
col2.ColumnName = "Name";
col3.DataType = System.Type.GetType("System.String");
col3.ColumnName = "Addr"; col3.DefaultValue = "서울";
col4.DataType = System.Type.GetType("System.String");
col4.ColumnName = "Tel";
customer_dt.Columns.Add(col1); customer_dt.Columns.Add(col2);
customer_dt.Columns.Add(col3); customer_dt.Columns.Add(col4);
DataRow row1 = customer_dt.NewRow();
row1[1] = "가길동"; row1[2] = "수원"; row1[3] = "111-2222";
customer_dt.Rows.Add(row1);
DataRow row2 = customer_dt.NewRow();
row2[1] = "나길동"; row2[2] = "울산"; row2[3] = "111-2222";
customer_dt.Rows.Add(row2);
DataRow row3 = customer_dt.NewRow();
row3[1] = "다길동"; row3[2] = "부산"; row3[3] = "333-2222";
customer_dt.Rows.Add(row3);
Console.Write("\n");
foreach (DataColumn header in customer_dt.Columns) {
Console.Write("{0, -6}\t", header.ColumnName);
}
Console.WriteLine("\n---------------------------------");
foreach (DataRow rows in customer_dt.Rows)
{
foreach (DataColumn cols in customer_dt.Columns)
{
Console.Write("{0, -4}\t", rows[cols.ColumnName]);
}
Console.Write("\n");
}
Console.WriteLine("\n"); Console.WriteLine("Done!, Press Enter.");
DataSet set = new DataSet("customer_sales");
set.Tables.Add(customer_dt);
//DataSet의 내용을 XML로 출력
Console.WriteLine(set.GetXml());
//--------------------------------
// 쿼리식 기반 Linq To DataSet
//--------------------------------
IEnumerable query = from customer in customer_dt.AsEnumerable()
select customer;
Console.WriteLine("-----------------------------------------");
Console.WriteLine("Customers : ");
foreach (DataRow r in query)
{
Console.WriteLine(r.Field<string>("Name") + "::" + r.Field<string>("Addr") + "::" + r.Field<string>("Tel"));
}
//--------------------------------
// 쿼리식 기반 Linq To DataSet
//--------------------------------
IEnumerable query0 = from customer in customer_dt.AsEnumerable()
select customer.Field<string>("Name");
Console.WriteLine("-----------------------------------------");
Console.WriteLine("Customer Names : ");
foreach (string customerName in query0)
{
Console.WriteLine(customerName);
}
//--------------------------------------
// 메소드 기반 쿼리구문 Linq To DataSet
//--------------------------------------
var query2 = customer_dt.AsEnumerable().
Select(customer => new
{
Name = customer.Field<string>("Name"),
Addr = customer.Field<string>("Addr"),
Tel = customer.Field<string>("Tel")
});
Console.WriteLine("-----------------------------------------");
Console.WriteLine("Customers : ");
foreach (var customerInfo in query2)
{
Console.WriteLine("Name: {0}, Addr: {1}, Tel : {2}",
customerInfo.Name, customerInfo.Addr, customerInfo.Tel);
}
Console.WriteLine("-----------------------------------------");
//SALES 데이터 생성
DataTable sales_dt = new DataTable("sales");
DataColumn scol1 = new DataColumn();
DataColumn scol2 = new DataColumn();
scol1.DataType = System.Type.GetType("System.String");
scol1.ColumnName = "Name";
scol2.DataType = System.Type.GetType("System.String");
scol2.ColumnName = "Goods";
sales_dt.Columns.Add(scol1);
sales_dt.Columns.Add(scol2);
DataRow srow1 = sales_dt.NewRow();
srow1[0] = "가길동"; srow1[1] = "수박";
sales_dt.Rows.Add(srow1);
DataRow srow2 = sales_dt.NewRow();
srow2[0] = "나길동"; srow2[1] = "참외";
sales_dt.Rows.Add(srow2);
set.Tables.Add(sales_dt);
//---------------------------------------------
var query3 =
from customer in customer_dt.AsEnumerable()
from sales in sales_dt.AsEnumerable()
where customer.Field<string>("Name") == sales.Field<string>("Name")
select new
{
Name = customer.Field<string>("Name"),
Addr = customer.Field<string>("Addr"),
Goods = sales.Field<string>("Goods")
};
foreach (var customerSale in query3)
{
Console.WriteLine("Name: {0}, Addr: {1}, Goods : {2} ",
customerSale.Name, customerSale.Addr, customerSale.Goods);
}
}
}
[결과]
ID Name Addr Tel
---------------------------------
1 가길동 수원 111-2222
2 나길동 울산 111-2222
3 다길동 부산 333-2222
Done!, Press Enter.
<customer_sales>
<customer>
<ID>1</ID>
<Name>가길동</Name>
<Addr>수원</Addr>
<Tel>111-2222</Tel>
</customer>
<customer>
<ID>2</ID>
<Name>나길동</Name>
<Addr>울산</Addr>
<Tel>111-2222</Tel>
</customer>
<customer>
<ID>3</ID>
<Name>다길동</Name>
<Addr>부산</Addr>
<Tel>333-2222</Tel>
</customer>
</customer_sales>
-----------------------------------------
Customers :
가길동::수원::111-2222
나길동::울산::111-2222
다길동::부산::333-2222
-----------------------------------------
Customer Names :
가길동
나길동
다길동
-----------------------------------------
Customers :
Name: 가길동, Addr: 수원, Tel : 111-2222
Name: 나길동, Addr: 울산, Tel : 111-2222
Name: 다길동, Addr: 부산, Tel : 333-2222
-----------------------------------------
Name: 가길동, Addr: 수원, Goods : 수박
Name: 나길동, Addr: 울산, Goods : 참외