最簡單的方法是使用 .Distinct() 來達成
.Distinct() 會根據查詢結果裡的所有欄位的值來決定是否為重複資料
若今天的資料如下
ID | ProjectName | Price | Country | CreateDatetime |
1001 | hello_kity | 1000 | TW | 2017/04/07 |
1002 | hulk | 2000 | TW | 2017/04/05 |
1003 | hulk | 2000 | US | 2017/04/06 |
當我們沒有使用.Distinct() 時, 若以底下的語法查詢ProjectName 與 Price的話,
var _info = (from m in _DB.tblmodel
select new
{
ProjectName = m.ProjectName,
Price = m.Price
}
).ToList();
|
我們會得到重複的資料如下
ProjectName | Price | |
1 | hello_kity | 1000 |
2 | hulk | 2000 |
3 | hulk | 2000 |
但是如果使用了.Distinct() 的話
var _info = (from m in _DB.tblmodel
select new
{
ProjectName = m.ProjectName,
Price = m.Price
}
).Distinct().ToList();
|
重複的資料則會被過濾掉,
ProjectName | Price | |
1 | hello_kity | 1000 |
2 | hulk | 2000 |
但如果此時老闆只希望知道目前公司有哪些project, 並要我們按照最近的生產時間排序出來
則我們可以使用OrderByDescending() 來將結果排序
var _info = (from m in _DB.tblmodel
where m.ProjectName.ToLower().Contains(query.ToLower().Trim()) || string.IsNullOrEmpty(query)
select new
{
ProjectName = m.ProjectName,
CreateDatetime = m.CreateDatetime
}
).Distinct().OrderByDescending(x => x.CreateDatetime).ToList();
|
但很不幸的是, 由於hulk有不同的CreateDatetime, 使的.Distinct() 認為ProjectName "hulk" 有兩筆不同的資料, 所以查詢的結果會變成如下:
ProjectName | CreateDatetime | |
1 | hello_kity | 2017/04/07 |
2 | hulk | 2017/04/05 |
3 | hulk | 2017/04/06 |
而這並不是我們想要的結果,
我們是希望查詢結果能根據最新的CreateDatetime把不同的Project name一一列出
這個時候, 只要對排序(OrderByDescending)的結果, 使用 GroupBy() 函數,就能簡單地產生排序後的分組資訊
語法如下:
var _info = (from m in _DB.tblmodel
where m.ProjectName.ToLower().Contains(query.ToLower().Trim()) || string.IsNullOrEmpty(query)
select new
{
ProjectName = m.ProjectName,
CreateDatetime = m.CreateDatetime
}
).Distinct().OrderByDescending(x => x.CreateDatetime).GroupBy(x=>x.ProjectName).ToList();
|
最後再搭配迴圈
一個個去存取 property .key
把project name的值給取出來,就能達到我們要的結果
如:
foreach( var prj in _info){
Sytem.Console.WriteLine( prj.key );
}
結果~
hello_kity
hulk
留言
張貼留言