LINQ - ชุดข้อมูล
ชุดข้อมูลนำเสนอการแสดงข้อมูลที่มีประโยชน์อย่างยิ่งในหน่วยความจำและใช้สำหรับแอปพลิเคชันที่ใช้ข้อมูลที่หลากหลาย LINQ to Dataset เป็นหนึ่งในเทคโนโลยีของ LINQ to ADO.NET ช่วยอำนวยความสะดวกในการดำเนินการสืบค้นข้อมูลของชุดข้อมูลในลักษณะที่ไม่ยุ่งยากและเพิ่มประสิทธิผล
การแนะนำ LINQ ไปยังชุดข้อมูล
LINQ to Dataset ทำให้งานในการสืบค้นเป็นเรื่องง่ายสำหรับนักพัฒนา พวกเขาไม่จำเป็นต้องเขียนข้อความค้นหาในภาษาแบบสอบถามที่เฉพาะเจาะจง แต่สามารถเขียนในภาษาโปรแกรมได้ LINQ ไปยัง Dataset ยังสามารถใช้สำหรับการสืบค้นโดยที่ข้อมูลถูกรวมจากแหล่งข้อมูลหลายแหล่ง สิ่งนี้ไม่จำเป็นต้องมีผู้ให้บริการ LINQ เช่นเดียวกับ LINQ ถึง SQL และ LINQ เป็น XML สำหรับการเข้าถึงข้อมูลจากในคอลเลกชันหน่วยความจำ
ด้านล่างนี้เป็นตัวอย่างง่ายๆของแบบสอบถาม LINQ to Dataset ซึ่งได้รับแหล่งข้อมูลก่อนจากนั้นชุดข้อมูลจะเต็มไปด้วยตารางข้อมูลสองตาราง ความสัมพันธ์ถูกสร้างขึ้นระหว่างทั้งตารางและแบบสอบถาม LINQ ถูกสร้างขึ้นกับทั้งสองตารางโดยใช้อนุประโยคเข้าร่วม สุดท้าย foreach loop ใช้เพื่อแสดงผลลัพธ์ที่ต้องการ
ค#
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LINQtoDataset {
class Program {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
string sqlSelect = "SELECT * FROM Department;" + "SELECT * FROM Employee;";
// Create the data adapter to retrieve data from the database
SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connectString);
// Create table mappings
da.TableMappings.Add("Table", "Department");
da.TableMappings.Add("Table1", "Employee");
// Create and fill the DataSet
DataSet ds = new DataSet();
da.Fill(ds);
DataRelation dr = ds.Relations.Add("FK_Employee_Department",
ds.Tables["Department"].Columns["DepartmentId"],
ds.Tables["Employee"].Columns["DepartmentId"]);
DataTable department = ds.Tables["Department"];
DataTable employee = ds.Tables["Employee"];
var query = from d in department.AsEnumerable()
join e in employee.AsEnumerable()
on d.Field<int>("DepartmentId") equals
e.Field<int>("DepartmentId")
select new {
EmployeeId = e.Field<int>("EmployeeId"),
Name = e.Field<string>("Name"),
DepartmentId = d.Field<int>("DepartmentId"),
DepartmentName = d.Field<string>("Name")
};
foreach (var q in query) {
Console.WriteLine("Employee Id = {0} , Name = {1} , Department Name = {2}",
q.EmployeeId, q.Name, q.DepartmentName);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Data.SqlClient
Imports System.Linq
Module LinqToDataSet
Sub Main()
Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()
Dim sqlSelect As String = "SELECT * FROM Department;" + "SELECT * FROM Employee;"
Dim sqlCnn As SqlConnection = New SqlConnection(connectString)
sqlCnn.Open()
Dim da As New SqlDataAdapter
da.SelectCommand = New SqlCommand(sqlSelect, sqlCnn)
da.TableMappings.Add("Table", "Department")
da.TableMappings.Add("Table1", "Employee")
Dim ds As New DataSet()
da.Fill(ds)
Dim dr As DataRelation = ds.Relations.Add("FK_Employee_Department", ds.Tables("Department").Columns("DepartmentId"), ds.Tables("Employee").Columns("DepartmentId"))
Dim department As DataTable = ds.Tables("Department")
Dim employee As DataTable = ds.Tables("Employee")
Dim query = From d In department.AsEnumerable()
Join e In employee.AsEnumerable() On d.Field(Of Integer)("DepartmentId") Equals
e.Field(Of Integer)("DepartmentId")
Select New Person With { _
.EmployeeId = e.Field(Of Integer)("EmployeeId"),
.EmployeeName = e.Field(Of String)("Name"),
.DepartmentId = d.Field(Of Integer)("DepartmentId"),
.DepartmentName = d.Field(Of String)("Name")
}
For Each e In query
Console.WriteLine("Employee Id = {0} , Name = {1} , Department Name = {2}", e.EmployeeId, e.EmployeeName, e.DepartmentName)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
Class Person
Public Property EmployeeId As Integer
Public Property EmployeeName As String
Public Property DepartmentId As Integer
Public Property DepartmentName As String
End Class
End Module
เมื่อโค้ดข้างบนของ C # หรือ VB ถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
Employee Id = 1, Name = William, Department Name = Account
Employee Id = 2, Name = Benjamin, Department Name = Account
Employee Id = 3, Name = Miley, Department Name = Sales
Press any key to continue.
การสืบค้นชุดข้อมูลโดยใช้ LinQ ไปยังชุดข้อมูล
ก่อนที่จะเริ่มค้นหาชุดข้อมูลโดยใช้ LINQ เป็นชุดข้อมูลจำเป็นอย่างยิ่งที่จะต้องโหลดข้อมูลลงในชุดข้อมูลและทำได้โดยใช้คลาส DataAdapter หรือโดย LINQ ไปยัง SQL การสร้างแบบสอบถามโดยใช้ LINQ เป็นชุดข้อมูลค่อนข้างคล้ายกับการสร้างแบบสอบถามโดยใช้ LINQ ร่วมกับแหล่งข้อมูลอื่น ๆ ที่เปิดใช้งาน LINQ
แบบสอบถามตารางเดียว
ในแบบสอบถามตารางเดียวต่อไปนี้ใบสั่งออนไลน์ทั้งหมดจะถูกรวบรวมจาก SalesOrderHeaderTtable จากนั้นรหัสคำสั่งวันที่สั่งซื้อและหมายเลขใบสั่งจะแสดงเป็นผลลัพธ์
C#
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace LinqToDataset {
class SingleTable {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
string sqlSelect = "SELECT * FROM Department;";
// Create the data adapter to retrieve data from the database
SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connectString);
// Create table mappings
da.TableMappings.Add("Table", "Department");
// Create and fill the DataSet
DataSet ds = new DataSet();
da.Fill(ds);
DataTable department = ds.Tables["Department"];
var query = from d in department.AsEnumerable()
select new {
DepartmentId = d.Field<int>("DepartmentId"),
DepartmentName = d.Field<string>("Name")
};
foreach (var q in query) {
Console.WriteLine("Department Id = {0} , Name = {1}",
q.DepartmentId, q.DepartmentName);
}
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
VB
Imports System.Data.SqlClient
Imports System.Linq
Module LinqToDataSet
Sub Main()
Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()
Dim sqlSelect As String = "SELECT * FROM Department;"
Dim sqlCnn As SqlConnection = New SqlConnection(connectString)
sqlCnn.Open()
Dim da As New SqlDataAdapter
da.SelectCommand = New SqlCommand(sqlSelect, sqlCnn)
da.TableMappings.Add("Table", "Department")
Dim ds As New DataSet()
da.Fill(ds)
Dim department As DataTable = ds.Tables("Department")
Dim query = From d In department.AsEnumerable()
Select New DepartmentDetail With {
.DepartmentId = d.Field(Of Integer)("DepartmentId"),
.DepartmentName = d.Field(Of String)("Name")
}
For Each e In query
Console.WriteLine("Department Id = {0} , Name = {1}", e.DepartmentId, e.DepartmentName)
Next
Console.WriteLine(vbLf & "Press any key to continue.")
Console.ReadKey()
End Sub
Public Class DepartmentDetail
Public Property DepartmentId As Integer
Public Property DepartmentName As String
End Class
End Module
เมื่อโค้ดข้างบนของ C # หรือ VB ถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
Department Id = 1, Name = Account
Department Id = 2, Name = Sales
Department Id = 3, Name = Pre-Sales
Department Id = 4, Name = Marketing
Press any key to continue.