iT邦幫忙

0

linq問題求解

public List<HDOrderDto> FindHistory(string pat_guid,DateTime startDate, DateTime endDate)
        {
         
            if (String.IsNullOrWhiteSpace(pat_guid)) return null;
            var query = (from x in _repo.HD_ORDER
                         where x.PAT_GUID == pat_guid && x.ODR_DATE >= startDate && x.ODR_DATE <= endDate                                        
                         select new HDOrderDto
                         {
                             HDType = x.HD_TYPE,
                             OdrDate = x.ODR_DATE,
                             DryWtDesc = x.DRY_WT_DESC,
                             DryWtReasonDesc = x.DRY_WT_REASON_DESC
                         }).Distinct().OrderByDescending(x=>x.OdrDate).ToList<HDOrderDto>();
            return query;             
        }

這是我的程式碼,主要是想顯示出HDOrderDto裡的欄位並照日期順序排列這樣,現在
我想做一個重覆內容不顯示的查詢,想請問是否需要再加上groupby這語法?只是這語
法我不太會下能否為我解答一下?謝謝。

1 個回答

1
暐翰
iT邦大師 1 級 ‧ 2018-11-20 09:18:57
最佳解答

現在我想做一個重覆內容不顯示的查詢,想請問是否需要再加上groupby這語法?

不需要GroupBy,你已經使用Distinct,除非你有分組需求

舉例:

	var list = new List<dynamic>() { 
		new {id="1",value="no1",value2="no2"}, 
		new {id="1",value="no1",value2="no2"} 
	};
	var result = list.Select(s => new { s.id,s.value} ).Distinct();
	//	result結果:
	//	id,value
	//	1,no1 	

新問題:

原始數據

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

期望得到

ProjectName Price
hello_kity 1000
hulk 2000

回答:
使用GroupBy+Select Key

void Main()
{
	var datas = JsonConvert.DeserializeObject<List<Tourism>>(@"
[
 {
   ""ID"": 1001,
   ""ProjectName"": ""hello_kity"",
   ""Price"": 1000,
   ""Country"": ""TW"",
   ""CreateDatetime"": ""2017/04/07""
 },
 {
   ""ID"": 1002,
   ""ProjectName"": ""hulk"",
   ""Price"": 2000,
   ""Country"": ""TW"",
   ""CreateDatetime"": ""2017/04/05""
 },
 {
   ""ID"": 1003,
   ""ProjectName"": ""hulk"",
   ""Price"": 2000,
   ""Country"": ""US"",
   ""CreateDatetime"": ""2017/04/06""
 }
]
	");

	var result = datas.GroupBy(g => new { g.ProjectName, g.Price }).Select(s => new { s.Key.ProjectName,s.Key.Price});
}

// Define other methods and classes here
public class Tourism
{
	public int ID { get; set; }
	public string ProjectName { get; set; }
	public int Price { get; set; }
	public string Country { get; set; }
	public string CreateDatetime { get; set; }
}

2018-11-20.15.39.16-image.png

看更多先前的回應...收起先前的回應...
tenno081 iT邦新手 4 級 ‧ 2018-11-20 10:04:36 檢舉

你好,我有遇到跟這個網站所說的一樣的問題
http://andy51002000.blogspot.com/2017/04/c-linq.html
所以我才想要不要也跟他一樣加個groupby這樣

暐翰 iT邦大師 1 級 ‧ 2018-11-20 10:27:02 檢舉

文中解釋怪怪的
除非你要做分組動作,不要然不需要加Group

舉例,文中資料如以下:

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

文中作者使用select CreateDatetime再做distinct當然無法去重,因為值不一樣跟order沒有關係

tenno081 iT邦新手 4 級 ‧ 2018-11-20 11:53:39 檢舉

我看他是說因為他後來做了排序才會無法出現想要的結果,剛好我也是
這樣。後來我找到的是不用distinct跟groupby,直接在controller
裡用foreach來處理,所以現在我在想有沒有辦法不動到ocmtroller
就能有解的方法。

 List<HDOrderDto> dtos = hsrv.FindHistory(pat.PatGuid, model.StartDate, model.EndDate);
         
            dtos = dtos.Where(x => x.DryWtDesc != null && x.DryWtDesc != "").ToList<HDOrderDto>();          
            string lastDryWt = "";
           
            foreach (HDOrderDto dto in dtos)
            {
                if (!String.IsNullOrWhiteSpace(dto.DryWtDesc) && dto.DryWtDesc != lastDryWt)
                {
                    lastDryWt = dto.DryWtDesc;                 
                    model.HDOrders.Add(dto);
                }
            }
暐翰 iT邦大師 1 級 ‧ 2018-11-20 11:59:56 檢舉

有參考數據跟期望數據嗎?
可以參考別人文章提問方式:請問如何抓出 '20歲以下' 佔總會數前25% 的所有總會數跟總資產和平均資產和人數? - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天

舉例:
原始數據

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

期望得到

ProjectName Price
hello_kity 1000
hulk 2000
tenno081 iT邦新手 4 級 ‧ 2018-11-20 13:13:33 檢舉

對,就是類似您的舉例範例所呈現的結果,不好意思,下次我會改進

暐翰 iT邦大師 1 級 ‧ 2018-11-20 15:39:57 檢舉

tenno081 我更新回答了,你看一下有問題再跟我說

tenno081 iT邦新手 4 級 ‧ 2018-11-20 16:25:44 檢舉

喔!我懂了,真心感謝。

暐翰 iT邦大師 1 級 ‧ 2018-11-20 16:28:48 檢舉

/images/emoticon/emoticon12.gif

我要發表回答

立即登入回答