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)))
                    .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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LINQ(Language Integrated Query)是.NET框架中的一种查询语言,用于对各种数据源进行查询和操作。在LINQ中,JOIN操作用于将两个或多个数据源中的元素进行关联。CASE WHEN语句是SQL中的条件语句,用于根据不同的条件执行不同的操作。 在LINQ中,JOIN操作可以使用join关键字来实现。JOIN操作可以在两个数据源之间建立关联,并根据指定的条件将它们连接起来。JOIN操作可以用于不同类型的数据源,如集合、数组、数据库表等。 CASE WHEN语句在LINQ中可以使用条件表达式来实现。条件表达式可以根据不同的条件返回不同的结果。在LINQ中,可以使用条件表达式来对查询结果进行筛选、排序或其他操作。 下面是一个示例代码,演示了LINQ中的JOIN操作和CASE WHEN语句的使用: ```csharp var customers = new List<Customer> { new Customer { Id = 1, Name = "John" }, new Customer { Id = 2, Name = "Alice" }, new Customer { Id = 3, Name = "Bob" } }; var orders = new List<Order> { new Order { Id = 1, CustomerId = 1, Product = "Product A" }, new Order { Id = 2, CustomerId = 2, Product = "Product B" }, new Order { Id = 3, CustomerId = 1, Product = "Product C" } }; var result = from c in customers join o in orders on c.Id equals o.CustomerId select new { CustomerName = c.Name, OrderProduct = o.Product, OrderStatus = (o.Id % 2 == 0) ? "Even" : "Odd" }; foreach (var item in result) { Console.WriteLine($"Customer: {item.CustomerName}, Order: {item.OrderProduct}, Status: {item.OrderStatus}"); } ``` 上述代码中,我们定义了两个类Customer和Order,分别表示客户和订单。通过LINQ的JOIN操作,我们将两个数据源customers和orders关联起来,并使用CASE WHEN语句根据订单的Id判断其奇偶性,将结果存储在result变量中,并进行输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值