1. 程式人生 > >CASE WHEN THEN ELSE +多表+子查詢 轉 Linq三元運算

CASE WHEN THEN ELSE +多表+子查詢 轉 Linq三元運算

SQL:

strQuery = "SELECT PRV.FACTORY, PRV.PRV_TYPE, PRV.PRV_ITEM1, PRV.PRV_ITEM2, PRV.PRV_ITEM3, "
                                + " PRV.PRV_GRP_ID, PRV.CREATE_USER_ID, PRV.CREATE_TIME, PRV.UPDATE_USER_ID, PRV.UPDATE_TIME, "
                                + " ISNULL((SELECT PRV_GRP_DESC FROM SECPRVGROUP WHERE FACTORY=PRV.FACTORY AND PRV_GRP_ID=PRV.PRV_GRP_ID), ' ') PRV_GRP_DESC, "
                                + " CASE PRV.PRV_TYPE "
                                + "     WHEN '" + PRV_TYPE_RES + "' THEN ISNULL((SELECT RES_DESC FROM RASRES WHERE FACTORY=PRV.FACTORY AND RES_ID=PRV.PRV_ITEM1), ' ')"
                                + "     WHEN '" + PRV_TYPE_OPER + "' THEN ISNULL((SELECT OPER_SHORT_DESC FROM WIPOPER WHERE FACTORY=PRV.FACTORY AND OPER=PRV.PRV_ITEM1), ' ')"
                                + "     WHEN '" + PRV_TYPE_GCMTBL + "' THEN ISNULL((SELECT TABLE_DESC FROM BASGCMTABLE WHERE FACTORY=PRV.FACTORY AND TABLE_NAME=PRV.PRV_ITEM1), ' ')"
                                + "     WHEN '" + PRV_TYPE_ATTR + "' THEN ISNULL((SELECT ATTR_DESC FROM BASATTRNAME WHERE FACTORY=PRV.FACTORY AND ATTR_TYPE=PRV.PRV_ITEM2 AND ATTR_NAME=PRV.PRV_ITEM1), ' ')"
                                + "     ELSE ' '"
                                + " END AS PRV_ITEM_DESC"
                                + " FROM SECPRIVILEGE AS PRV "
                                + " WHERE PRV.FACTORY=? "
                                + "     AND (PRV.PRV_TYPE > ? "
                                + "          OR (PRV.PRV_TYPE = ? AND PRV.PRV_ITEM1 > ?) "
                                + "          OR (PRV.PRV_TYPE = ? AND PRV.PRV_ITEM1 = ? AND PRV.PRV_ITEM2 > ?) "
                                + "          OR (PRV.PRV_TYPE = ? AND PRV.PRV_ITEM1 = ? AND PRV.PRV_ITEM2 = ? AND PRV.PRV_ITEM3 >= ?) "
                                + "         ) "
                                + " ORDER BY PRV.FACTORY ASC"
                                + " , PRV.PRV_TYPE ASC"
                                + " , PRV.PRV_ITEM1 ASC"
                                + " , PRV.PRV_ITEM2 ASC"
                                + " , PRV.PRV_ITEM3 ASC"
                                + " , PRV.PRV_GRP_ID ASC";
  private const string PRV_TYPE_RES = "RESOURCE";
  private const string PRV_TYPE_OPER = "OPERATION";
  private const string PRV_TYPE_GCMTBL = "GCMTABLE";
  private const string PRV_TYPE_ATTR = "ATTRIBUTE";
  private const string PRV_TYPE_SERVICE = "SERVICE";

 

to Linq:

 var query = ctx.Secprivilege.Where(t => t.Factory == sFactory && (t.PrvType.CompareTo(sPrvType) > 0 || (t.PrvType.CompareTo(sPrvType) == 0 && t.PrvItem1.CompareTo(sPrvItem1) > 0)
                 || (t.PrvType == sPrvType && t.PrvItem1 == sPrvItem1 && t.PrvItem2.CompareTo(sPrvItem2) > 0) || (t.PrvType == sPrvType && t.PrvItem1 == sPrvItem1 && t.PrvItem2 == sPrvItem2 && t.PrvItem3.CompareTo(sPrvItem3) > 0)))
                    .Select(
                        t => new
                        {
                            Factory="empty",
                            PrvType = "empty",
                            PrvItem1 = "empty",
                            PrvItem2 = "empty",
                            PrvItem3 = "empty",
                            PrvGrpId = "empty",
                            CreateUserId = "empty",
                            CreateTime = "empty",
                            UpdateUserId = "empty",
                            UpdateTime = "empty",
                            PRV_ITEM_DESC = t.PrvType == "RESOURCE" ? ctx.Rasres.FirstOrDefault(t2 => t2.Factory == t.Factory && t2.ResId == t.PrvItem1).ResDesc
                            : (t.PrvType == "OPERATION" ? ctx.Wipoper.FirstOrDefault(t2 => t2.Factory == t.Factory && t2.Oper == t.PrvItem1).OperShortDesc
                            : (t.PrvType == "GCMTABLE" ? ctx.Basgcmtable.FirstOrDefault(t2 => t2.Factory == t.Factory && t2.TableName == t.PrvItem1).TableDesc
                            : (t.PrvType == "ATTRIBUTE" ? ctx.Basattrname.FirstOrDefault(t2 => t2.Factory == t.Factory && t2.AttrName == t.PrvItem1 && t2.AttrType == t.PrvItem2).AttrDesc : " ")))
                        }
                    ).OrderBy(t => t.Factory).ThenBy(t => t.PrvType).ThenBy(t => t.PrvItem1).ThenBy(t => t.PrvItem2).ThenBy(t => t.PrvItem3).ThenBy(t => t.PrvGrpId);

注:(1)、要查的欄位需要連續到select(t=> new{})結果中(不然orderBy檢索不到)

(2)、CASE [欄位1] WHEN [匹配值1]  THEN

                     WHEN         [匹配值2]   THEN

                     WHEN         [匹配值2]   THEN

                    &nbs