iT邦幫忙

0

想問下 LINQ 的 Distinct 和 OrderBy 的問題

想要用 cAAA_TYPE, t1.cAAA_KIND, t1.cAAA_LEVEL 做去除重複的依據,
再用 cAAA_KIND, iAAA_SEQ 做排序
以下是目前的做法,能進一步簡化或是有其他簡易的做法嗎?

var dt = (from t1 in db.AAA
          where t1.bAAA_CANCEL == false
             && t1.cAAA_LEVEL == "C"
//orderby t1.cAAA_KIND, t1.iAAA_SEQ  //先排序再Distinct,會發生沒排序的錯誤
          select new
         {
              t1.cAAA_TYPE,
              t1.cAAA_KIND,
              t1.cAAA_LEVEL,
              //t1.iAAA_SEQ
          }).Distinct()
          .ToList().Select(t1 => new
          {
             cAAA_TYPE = t1.cAAA_TYPE,
             cAAA_KIND = t1.cAAA_KIND,
             cAAA_LEVEL = t1.cAAA_LEVEL,
             iAAA_SEQ = (from t4 in db.AAA
                        where t4.bAAA_CANCEL == false
                           && t4.cAAA_LEVEL == "C"
                           && t4.cAAA_TYPE == t1.cAAA_TYPE
                           && t4.cAAA_KIND == t1.cAAA_KIND
                           && t4.cAAA_LEVEL == t1.cAAA_LEVEL
                       select t4.iAAA_SEQ).FirstOrDefault()
           })
           .OrderBy(t=>t.cAAA_KIND)
           .ThenBy(t=>t.iAAA_SEQ)
           .ToList();
sion iT邦新手 5 級 ‧ 2019-07-18 15:42:59 檢舉
我是會先把SQL寫出來再翻譯成LINQ,其他大大也比較容易知道你要的結果
小魚 iT邦高手 1 級 ‧ 2019-07-18 16:13:43 檢舉
所以是為什麼要簡化?
優悠 iT邦新手 4 級 ‧ 2019-07-19 09:40:33 檢舉
小魚 我感覺我寫得不好,所以請教各位大大們

1 個回答

1
暐翰
iT邦大師 1 級 ‧ 2019-07-18 17:11:54
最佳解答

雖然不太明白為何要有這樣邏輯,但看起來你想要按照第一筆iAAA_SEQ來做排序?

沒猜錯你的SQL應該想要這樣的

select cAAA_TYPE,cAAA_KIND,cAAA_LEVEL
from AAA t1
group by cAAA_TYPE,cAAA_KIND,cAAA_LEVEL
order by cAAA_KIND,
    (select top 1 t2.iAAA_SEQ from AAA t2 where t1.cAAA_TYPE = t2.cAAA_TYPE
        and t1.cAAA_KIND = t2.cAAA_KIND and t1.cAAA_LEVEL = t2.cAAA_LEVEL)

LINQ可以這樣寫

	var list = (
		from t in AAAs
		group t by new
		{
			t.CAAAtTYPE,
			t.CAAAtKIND,
			t.CAAAtLEVEL
		} into t
		orderby t.Key.CAAAtKIND, (from s in t
		select s.IAAAtSEQ).First()
		select t into s
		select s.Key
	).ToList();


補充

  • 跟sion大大建議一樣,我會先嘗試使用SQL寫再寫成LINQ
  • 不要還沒組出結果前就ToList這樣會變成LINQ Object而不是SQL,會撈取大量資料到AP端。
優悠 iT邦新手 4 級 ‧ 2019-07-19 09:50:35 檢舉

感謝回答,其實這資料是某測驗表單,例如:一上(TYPE)01(LEVEL)國文(KIND)XX測驗(NAME)、一上(TYPE)02(LEVEL)數學(KIND)XX測驗(NAME),SEQ為同KIND裡的排序。
補充:目前只有一上(TYPE)的資料,所以沒特別排序此欄位,另外,KIND為LEVEL的中文化。

我要發表回答

立即登入回答