LINQ - DISTINCT的使用

摘要: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 distinctRows = db.t_Personnel.ToList().Distinct(new PersonDataRowComparer());

//建立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還要多加幾道工方能得到第二項的結果。