CASE WHEN THEN ELSE +多表+子查询 转 Linq三元运算

本文详细解析了从SQL查询转换为Linq查询的过程,包括复杂的条件筛选和多表联接,展示了如何在.NET环境中实现等效的数据操作。同时,文章提供了具体的代码示例,帮助读者理解SQL与Linq语法之间的映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)))
                    .Join(
                    ctx.Secprvgroup,
                    a => new { f=a.Factory,id=a.PrvGrpId},
                    b=> new { f=b.Factory,id=b.PrvGrpId},
                    (a, b) => new
                    {
                        PrvGrpDesc =b.PrvGrpDesc,
                        a.Factory,
                        a.PrvType ,
                        a.PrvItem1,
                        a.PrvItem2,
                        a.PrvItem3,
                        a.PrvGrpId,
                        a.CreateUserId,
                        a.CreateTime ,
                        a.UpdateUserId,
                        a.UpdateTime,
                    }
                    )
                    .Select(
                        t => new
                        {
                            Factory="empty",
                            PrvType = "empty",
                            PrvItem1 = "empty",
                            PrvItem2 = "empty",
                            PrvItem3 = "empty",
                            PrvGrpId = "empty",
                            CreateUserId = "empty",
                            CreateTime = "empty",
                            UpdateUserId = "empty",
                            UpdateTime = "empty",
                            PrvGrpDesc="empty",
                            PrvItemDesc = 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).ToList();

注:(1)、要查的字段需要连续到select(t=> new{})结果中(不然orderBy检索不到)

(2)、CASE [字段1] WHEN [匹配值1]  THEN

                     WHEN         [匹配值2]   THEN

                     WHEN         [匹配值2]   THEN

                     ELSE

 

转载于:https://my.oschina.net/8824/blog/3067638

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值