摘要:LINQ - DISTINCT的使用
前幾天因為專案的關係,接觸到LINQ的Distinct用法,其實用過後,LINQ的Distinct真是個好東西,以下就來介紹使用的方式。
資料庫資料:
1.單一欄位的Distinct
Code:
MyDataContext db = new MyDataContext();
//剔除FirstName欄位中有重複的資料
var result = (from p in db.t_Personnel
select p.FirstName).Distinct();
//建立DataTable
DataTable dt = new DataTable("SingleDistinct");
//在DataTable建立一個新欄位,欄位名稱為FirstName
dt.Columns.Add("FirstName");
//將資料LINQ所取出的值,填入DataTable的Rows中
foreach (var item in result)
{
DataRow dr = dt.NewRow();
dr["FirstName"] = item.ToString();
dt.Rows.Add(dr);
}
dataGridView1.DataSource = dt;
結果:
2.多欄位的Distinct
新增一個Class,取名為:PersonDataRowComparer。當有兩個相同欄位的值相同時,排除其中一個資料使用。
Code:
using System.Data;
using System.Collections;
namespace Test_Distinct
{
public class PersonDataRowComparer : IEqualityComparer
{
public bool Equals(t_Personnel t1, t_Personnel t2)
{
return (t1.ID == t2.ID && t1.FirstName == t2.FirstName);
}
public int GetHashCode(t_Personnel t)
{
return t.ToString().GetHashCode();
}
}
}
再來,回到Form1.cs中,完成剩下的程式。
Code:
MyDataContext db = new MyDataContext();
//用來排除當ID與FirstName有相同值時
IEnumerable
//建立DataTable
DataTable dt = new DataTable("SingleDistinct");
//在DataTable建立一個新欄位,欄位名稱為FirstName
dt.Columns.Add("ID");
dt.Columns.Add("FirstName");
dt.Columns.Add("LastName");
//將資料LINQ所取出的值,填入DataTable的Rows中
foreach (var item in distinctRows)
{
DataRow dr = dt.NewRow();
dr["ID"] = item.ID;
dr["FirstName"] = item.FirstName;
dr["LastName"] = item.LastName;
dt.Rows.Add(dr);
}
dataGridView1.DataSource = dt;
結果:
以後就可以用LINQ來好好的Distinct重複的資料嚕!!!
補充一下:
使用LINQ的多重Distinct所得到的結果,確實比下T-SQL來的好用,怎麼說,來看看下面的演示。
Select Distinct ID, FirstName From dbo.t_Personnel
結果:
倘若要得到第二項結果,看來直接下T-SQL語法似乎不那麼容易得到結果。
Select Distinct ID, FirstName, LastName From dbo.t_Personnel
結果:
看來使用T-SQL還要多加幾道工方能得到第二項的結果。