نام کاربری :   
کلمه عبور :   
[فراموشی رمز توسط ایمیل]
صفحه اصلی > دانش و فناوری > علوم کاربردی 


  چاپ        ارسال به دوست

ایجاد یک DataTable از یک Query

Data binding، یکی از کاربردهای رایج شی DataTable است. متد CopyToDataTable، خروجی های یک query را می گیرد و داده ها را در DataTable کپی می کند، و سپس می توان برای data binding استفاده کرد. وقتی عملیات های داده ها اجرا شود، DataTable جدید دوباره با DataTable منبع ادغام می شود.

متد CopyToDataTable از فرآیند زیر برای ایجاد یک DataTable از یک query استفاده می مند.

  1. متد CopyToDataTable، یک DataTable را از منبع جدول کپی برداری می کند (یک شی DataTable که اینترفیس IQueryable<T> را پیاده سازی می کند). منبع IEnumerable عموماً از یک عبارت LINQ to DataSet یا query متد نشات می گیرد.
  2. Schemaی DataTable کپی برداری شده، از ستون های شی DataRow شمارش شده در جدول منبع ساخته می شود، و نام جدول کپی برداری شده، نام جدول منبع است که کلمه "query" به آن ضمیمه شده است.
  3. برای هر ردیف در جدول منبع، محتویات ردیف به یک شی DataRow جدید کپی می شود، و سپس به جدول کپی برداری شده، وارد می شود. Propertyهای RowState و RowError، در طول عملیات کپی کردن، بدون تغییر باقی می مانند. اگر اشیاء DataRow در منبع از جدولی دیگر باشند، یک ArgumentException، ایجاد می شود.
  4. بعد از اینکه همه اشیاء DataRow در جدول خروجی قابل query کپی شوند، DataTable کپی شده بازگردانده می شود. اگر sequence اصلی، حاوی هیچ شی DataRow نباشد، متد یک DataTable خالی بازمی گرداند.

توجه داشته باشید که فراخوانی متد CopyToDataTable، باعث خواهد شد query برای اجرا شدن به جدول منبع بچسبد.

وقتی که متد CopyToDataTable با یک مرجع null یا value type قابل null در یک ردیف در جدول منبع روبرو می شود، . در این روش، valueهای null، در DataTable بازگردانده شده، بدرستی مدیریت می شوند.

نکته: متد CopyToDataTable، به صورت یک خروجی که می تواند ردیف ها را از اشیاء DataTable یا DataSet بازگرداند، پذیرفته می شود. متد CopyToDataTable، داده ها را کپی می کند، اما propertyها را از اشیاء DataTable یا DataSet اصلی به DataTable بازگردانده شده کپی نمی کند. شما باید propertyها، از قبیل Locale و TableName را در DataTable بازگردانده شده مستقیماً تنظیم کنید.

مثال زیر، جدول SalesOrderHeader table را برای سفارش های بعد 8 آگوست 2001، query می کند، و از متد CopyToDataTable برای ایجاد یک DataTable از آن query استفاده می کند. سپس DataTable به یک BindingSource می چسبد که به عنوان یک پروکسی برای یک DataGridView عمل می کند.

در VB:

 Bind the System.Windows.Forms.DataGridView object
to the System.Windows.Forms.BindingSource object.
dataGridView.DataSource = bindingSource

Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim orders As DataTable = ds.Tables("SalesOrderHeader")

Query the SalesOrderHeader table for orders placed
after August 8, 2001.
Dim query = _
From order In orders.AsEnumerable() _
Where order.Field(Of DateTime)("OrderDate") > New DateTime(2001, 8, 1) _
Select order

Create a table from the query.
Dim boundTable As DataTable = query.CopyToDataTable()

Bind the table to a System.Windows.Forms.BindingSource object,
which acts as a proxy for a System.Windows.Forms.DataGridView object.
bindingSource.DataSource = boundTable

در #C:

// Bind the System.Windows.Forms.DataGridView object
// to the System.Windows.Forms.BindingSource object.
dataGridView.DataSource = bindingSource;

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable orders = ds.Tables["SalesOrderHeader"];

// Query the SalesOrderHeader table for orders placed
// after August 8, 2001.
IEnumerable<DataRow> query =
from order in orders.AsEnumerable()
where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1)
select order;

// Create a table from the query.
DataTable boundTable = query.CopyToDataTable<DataRow>();

// Bind the table to a System.Windows.Forms.BindingSource object,
// which acts as a proxy for a System.Windows.Forms.DataGridView object.
bindingSource.DataSource = boundTable;

 

ایجاد یک متد CopyToDataTable<T> سفارشی

متدهای CopyToDataTable کنونی، فقط روی یک منبع IEnumerable<T>، یعنی جاییکه پارامتر ژنریک T، نوعی DataRow محسوب می شود، عمل می کند. گرچه این موضوع مفید است، اما به جداول اجازه نمی دهد از یک sequence انواع عددی (scalar) و queryهایی که انواع ناشناس را بازمی گردانند، یا از queryهایی که پیوند جداول را اجرا می کنند ایجاد شود.

در VB:

Public Class Item
Private _Id As Int32
Private _Price As Double
Private _Genre As String

Public Property Id() As Int32
Get
Return Id
End Get
Set(ByVal value As Int32)
_Id = value
End Set
End Property

Public Property Price() As Double
Get
Return _Price
End Get
Set(ByVal value As Double)
_Price = value
End Set
End Property

Public Property Genre() As String
Get
Return _Genre
End Get
Set(ByVal value As String)
_Genre = value
End Set
End Property

End Class
Public Class Book
Inherits Item
Private _Author As String
Public Property Author() As String
Get
Return _Author
End Get
Set(ByVal value As String)
_Author = value
End Set
End Property
End Class

Public Class Movie
Inherits Item
Private _Director As String
Public Property Director() As String
Get
Return _Director
End Get
Set(ByVal value As String)
_Director = value
End Set
End Property

End Class

در #C:

public class Item
{
public int Id { get; set; }
public double Price { get; set; }
public string Genre { get; set; }
}

public class Book : Item
{
public string Author { get; set; }
}

public class Movie : Item
{
public string Director { get; set; }
}

مثال

این مثال، یک پیوند بین جداول SalesOrderHeader و SalesOrderDetail را اجرا می کند تا سفارش های آنلاین ماه آگوست را بدست بیاورد و جدولی را از query ایجاد می کند.

در VB:


Fill the DataSet.
Dim ds As New DataSet()
ds.Locale = CultureInfo.InvariantCulture
See the FillDataSet method in the Loading Data Into a DataSet topic.
FillDataSet(ds)

Dim orders As DataTable = ds.Tables("SalesOrderHeader")
Dim details As DataTable = ds.Tables("SalesOrderDetail")


Dim query = _
From order In orders.AsEnumerable() _
Join detail In details.AsEnumerable() _
On order.Field(Of Integer)("SalesOrderID") Equals _
detail.Field(Of Integer)("SalesOrderID") _
Where order.Field(Of Boolean)("OnlineOrderFlag") = True And _
order.Field(Of DateTime)("OrderDate").Month = 8 _
Select New With _
{ _
.SalesOrderID = order.Field(Of Integer)("SalesOrderID"), _
.SalesOrderDetailID = detail.Field(Of Integer)("SalesOrderDetailID"), _
.OrderDate = order.Field(Of DateTime)("OrderDate"), _
.ProductID = detail.Field(Of Integer)("ProductID") _
}

Dim table As DataTable = query.CopyToDataTable()

 

 

در #C:

// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable orders = ds.Tables["SalesOrderHeader"];
DataTable details = ds.Tables["SalesOrderDetail"];

var query =
from order in orders.AsEnumerable()
join detail in details.AsEnumerable()
on order.Field<int>("SalesOrderID") equals
detail.Field<int>("SalesOrderID")
where order.Field<bool>("OnlineOrderFlag") == true
&& order.Field<DateTime>("OrderDate").Month == 8
select new
{
SalesOrderID =
order.Field<int>("SalesOrderID"),
SalesOrderDetailID =
detail.Field<int>("SalesOrderDetailID"),
OrderDate =
order.Field<DateTime>("OrderDate"),
ProductID =
detail.Field<int>("ProductID")
};

DataTable orderTable = query.CopyToDataTable();

مثال

مثال زیر، یک collection برای آیتمهای قیمتهای بالاتر از 9.99 دلار query می کند و یک جدول از خروجی های query ایجاد می کند.

در VB:

Dim book1 As New Book()
book1.Id = 1
book1.Price = 13.5
book1.Genre = "Comedy"
book1.Author = "Gustavo Achong"

Dim book2 As New Book
book2.Id = 2
book2.Price = 8.5
book2.Genre = "Drama"
book2.Author = "Jessie Zeng"

Dim movie1 As New Movie
movie1.Id = 1
movie1.Price = 22.99
movie1.Genre = "Comedy"
movie1.Director = "Marissa Barnes"

Dim movie2 As New Movie
movie2.Id = 1
movie2.Price = 13.4
movie2.Genre = "Action"
movie2.Director = "Emmanuel Fernandez"

Dim items(3) As Item
items(0) = book1
items(1) = book2
items(2) = movie1
items(3) = movie2

Query for items with price greater than 9.99.
Dim query = From i In items _
Where i.Price > 9.99 _
Order By i.Price _
Select New With {i.Price, i.Genre}

Dim table As DataTable
table = query.CopyToDataTable()

در #C:

// Create a sequence. 
Item[] items = new Item[]
{ new Book{Id = 1, Price = 13.50, Genre = "Comedy", Author = "Gustavo Achong"},
new Book{Id = 2, Price = 8.50, Genre = "Drama", Author = "Jessie Zeng"},
new Movie{Id = 1, Price = 22.99, Genre = "Comedy", Director = "Marissa Barnes"},
new Movie{Id = 1, Price = 13.40, Genre = "Action", Director = "Emmanuel Fernandez"}};

// Query for items with price greater than 9.99.
var query = from i in items
where i.Price > 9.99
orderby i.Price
select i;

// Load the query results into new DataTable.
DataTable table = query.CopyToDataTable();

مثال

مثال زیر، یک collection برای آیتمهای قیمتهای بالاتر از 9.99 دلار query می کند و خروجی ها رانمایش می دهد. Sequence بازگردانده شده انواع ناشناس در یک جدول موجود بارگذاری می کند.

 
در VB:
Dim book1 As New Book()
book1.Id = 1
book1.Price = 13.5
book1.Genre = "Comedy"
book1.Author = "Gustavo Achong"

Dim book2 As New Book
book2.Id = 2
book2.Price = 8.5
book2.Genre = "Drama"
book2.Author = "Jessie Zeng"

Dim movie1 As New Movie
movie1.Id = 1
movie1.Price = 22.99
movie1.Genre = "Comedy"
movie1.Director = "Marissa Barnes"

Dim movie2 As New Movie
movie2.Id = 1
movie2.Price = 13.4
movie2.Genre = "Action"
movie2.Director = "Emmanuel Fernandez"

Dim items(3) As Item
items(0) = book1
items(1) = book2
items(2) = movie1
items(3) = movie2

Create a table with a schema that matches that of the query results.
Dim table As DataTable = New DataTable()
table.Columns.Add("Price", GetType(Integer))
table.Columns.Add("Genre", GetType(String))

Query for items with price greater than 9.99.
Dim query = From i In items _
Where i.Price > 9.99 _
Order By i.Price _
Select New With {i.Price, i.Genre}

query.CopyToDataTable(table, LoadOption.PreserveChanges)

در #C:

 

 

 

 

// Create a sequence. 
Item[] items = new Item[]
{ new Book{Id = 1, Price = 13.50, Genre = "Comedy", Author = "Gustavo Achong"},
new Book{Id = 2, Price = 8.50, Genre = "Drama", Author = "Jessie Zeng"},
new Movie{Id = 1, Price = 22.99, Genre = "Comedy", Director = "Marissa Barnes"},
new Movie{Id = 1, Price = 13.40, Genre = "Action", Director = "Emmanuel Fernandez"}};

// Create a table with a schema that matches that of the query results.
DataTable table = new DataTable();
table.Columns.Add("Price", typeof(int));
table.Columns.Add("Genre", typeof(string));

var query = from i in items
where i.Price > 9.99
orderby i.Price
select new { i.Price, i.Genre };

query.CopyToDataTable(table, LoadOption.PreserveChanges);

مثال

مثال زیر، یک collection برای آیتمهای قیمتهای بالاتر از 9.99 دلار query می کند و خروجی ها رانمایش می دهد. Sequence بازگردانده شده انواع ناشناس در یک جدول موجود بارگذاری می کند. Schemaی جدول به طور اتوماتیک بسط پیدا می کند زیرا انواع Book و Movies از نوع Item مشتق می شوند.

در VB:

Dim book1 As New Book()
book1.Id = 1
book1.Price = 13.5
book1.Genre = "Comedy"
book1.Author = "Gustavo Achong"

Dim book2 As New Book
book2.Id = 2
book2.Price = 8.5
book2.Genre = "Drama"
book2.Author = "Jessie Zeng"

Dim movie1 As New Movie
movie1.Id = 1
movie1.Price = 22.99
movie1.Genre = "Comedy"
movie1.Director = "Marissa Barnes"

Dim movie2 As New Movie
movie2.Id = 1
movie2.Price = 13.4
movie2.Genre = "Action"
movie2.Director = "Emmanuel Fernandez"

Dim items(3) As Item
items(0) = book1
items(1) = book2
items(2) = movie1
items(3) = movie2

Load into an existing DataTable, expand the schema and
autogenerate a new Id.
Dim table As DataTable = New DataTable()
Dim dc As DataColumn = table.Columns.Add("NewId", GetType(Integer))
dc.AutoIncrement = True
table.Columns.Add("ExtraColumn", GetType(String))

Dim query = From i In items _
Where i.Price > 9.99 _
Order By i.Price _
Select New With {i.Price, i.Genre}

query.CopyToDataTable(table, LoadOption.PreserveChanges)

در #C:

// Create a sequence. 
Item[] items = new Item[]
{ new Book{Id = 1, Price = 13.50, Genre = "Comedy", Author = "Gustavo Achong"},
new Book{Id = 2, Price = 8.50, Genre = "Drama", Author = "Jessie Zeng"},
new Movie{Id = 1, Price = 22.99, Genre = "Comedy", Director = "Marissa Barnes"},
new Movie{Id = 1, Price = 13.40, Genre = "Action", Director = "Emmanuel Fernandez"}};

// Load into an existing DataTable, expand the schema and
// autogenerate a new Id.
DataTable table = new DataTable();
DataColumn dc = table.Columns.Add("NewId", typeof(int));
dc.AutoIncrement = true;
table.Columns.Add("ExtraColumn", typeof(string));

var query = from i in items
where i.Price > 9.99
orderby i.Price
select new { i.Price, i.Genre };

query.CopyToDataTable(table, LoadOption.PreserveChanges);

مثال

مثال زیر، یک collection برای آیتمهای قیمتهای بالاتر از 9.99 دلار query می کند و sequence دوبل (double) را باز می گرداند، و در یک جدول جدید بارگذاری می شود.

در VB:

Dim book1 As New Book()
book1.Id = 1
book1.Price = 13.5
book1.Genre = "Comedy"
book1.Author = "Gustavo Achong"

Dim book2 As New Book
book2.Id = 2
book2.Price = 8.5
book2.Genre = "Drama"
book2.Author = "Jessie Zeng"

Dim movie1 As New Movie
movie1.Id = 1
movie1.Price = 22.99
movie1.Genre = "Comedy"
movie1.Director = "Marissa Barnes"

Dim movie2 As New Movie
movie2.Id = 1
movie2.Price = 13.4
movie2.Genre = "Action"
movie2.Director = "Emmanuel Fernandez"

Dim items(3) As Item
items(0) = book1
items(1) = book2
items(2) = movie1
items(3) = movie2

Dim query = From i In items _
Where i.Price > 9.99 _
Order By i.Price _
Select i.Price

Dim table As DataTable
table = query.CopyToDataTable()

 

در #C:

// Create a sequence. 
Item[] items = new Item[]
{ new Book{Id = 1, Price = 13.50, Genre = "Comedy", Author = "Gustavo Achong"},
new Book{Id = 2, Price = 8.50, Genre = "Drama", Author = "Jessie Zeng"},
new Movie{Id = 1, Price = 22.99, Genre = "Comedy", Director = "Marissa Barnes"},
new Movie{Id = 1, Price = 13.40, Genre = "Action", Director = "Emmanuel Fernandez"}};

// load sequence of scalars.
IEnumerable<double> query = from i in items
where i.Price > 9.99
orderby i.Price
select i.Price;

DataTable table = query.CopyToDataTable();




برگرفته شده از سایت تحلیل داده


٠٨:١٤ - 1390/12/29    /    شماره : ٧٥٨    /    تعداد نمایش : ٩٩١



خروج





   مطالب مرتبط
بازدیدها
امروز :1095
کل بازديدها :17648793
بازديدکنندگان آنلاين :2
بازديدازاین صفحه :183818