iT邦幫忙

1

LINQ GROUP BY問題

  • 分享至 

  • xImage

想請問一下我寫了一個方法

public List<MedecineDto> FindHistoryData2(string patGuid, string cid,DateTime StrDate, DateTime EndDate)
        {
            var query = (from x in _repo.MEDECINE
                         join z in _repo.HD_ORDER
                         on x.ORDER_GUID equals z.GUID                        
                         where
                         (patGuid == z.PAT_GUID && x.CID == cid)   
                         group x by new {x.HISTORY_GUID} into a
                         select new MedecineDto
                         {
                             GUID = a.FirstOrDefault().GUID,
                             CID = a.FirstOrDefault().CID,
                             ORDER_GUID = a.FirstOrDefault().ORDER_GUID,   
                             OWN_EXPENCE = a.FirstOrDefault().OWN_EXPENCE,
                             METHOD = a.FirstOrDefault().METHOD,
                             POUR = a.FirstOrDefault().POUR,
                             DELIVER = a.FirstOrDefault().DELIVER,
                             NOTICE = a.FirstOrDefault().NOTICE,
                             HISTORY_GUID = a.FirstOrDefault().HISTORY_GUID,
                             CRE_DATE = a.FirstOrDefault().CRE_DATE,
                             MOD_DATE = a.FirstOrDefault().MOD_DATE,      }).OrderByDescending(x=>x.CRE_DATE).ToList<MedecineDto>();
}

這樣寫第一次載入時會延遲數秒

public List<MedecineDto> FindHistoryData2(string patGuid, string cid,DateTime StrDate, DateTime EndDate)
{
  var query = (from x in _repo.MEDECINE
                         join z in _repo.HD_ORDER
                         on x.ORDER_GUID equals z.GUID                         
                         where
                         (patGuid == z.PAT_GUID && x.CID == cid)                       
                         select new MedecineDto
                         {                   
                             GUID = a.FirstOrDefault().GUID,
                             CID = a.FirstOrDefault().CID,
                             ORDER_GUID = a.FirstOrDefault().ORDER_GUID,   
                             OWN_EXPENCE = a.FirstOrDefault().OWN_EXPENCE,
                             METHOD = a.FirstOrDefault().METHOD,
                             POUR = a.FirstOrDefault().POUR,
                             DELIVER = a.FirstOrDefault().DELIVER,
                             NOTICE = a.FirstOrDefault().NOTICE,
                             HISTORY_GUID = a.FirstOrDefault().HISTORY_GUID,
                             CRE_DATE = a.FirstOrDefault().CRE_DATE,
                             MOD_DATE = a.FirstOrDefault().MOD_DATE, 
                         }).OrderByDescending(x=>x.CRE_DATE).ToList<MedecineDto>();
var Group = query.GroupBy(x => new {x.HISTORY_GUID}).Select(group=>group.FirstOrDefault()).ToList<MedecineDto>();
}

這樣反而沒問題
我能請問是差別在哪嗎?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
bachikevin
iT邦新手 5 級 ‧ 2021-09-10 10:17:16
最佳解答

你的上下兩段程式碼所產生的SQL語法不一樣

上面的程式碼會將group by交給SQL去做
下面的程式碼則是將查詢回來的結果再用LINQ來GROUP

我是這樣看自動產生的SQL語法

            // 將EF產生的SQL語法輸出在Console裡
            db.Database.Log = (log) => Console.WriteLine(log);

            var query1 = db.Stock2020.GroupBy(g => g.StockCode).ToList();

            var query2 = db.Stock2020.ToList().GroupBy(g => g.StockCode);

如果是SQL Server,也可以用SSMS工具,SQL Server Profiler來查看真正產出的SQL語法~

無論LINQ,EF等...有時還是要看看到底處理成什麼語法去做了

tenno081 iT邦研究生 4 級 ‧ 2021-09-10 13:58:13 檢舉

原來是這樣
我等等下載LINQAPD做一下比對
但不確定我能不能用就是
另外能否請問既然第一種是把gorupby在SQL裡完成
但他速度居然比較慢,我只有兩筆資料而已說
請問是我寫法有問題嗎?

我要發表回答

立即登入回答