C# Linq的多表join操作 空操作

DataSet dsOperator = GetAllOperatorInfo_ds();
                DataTable dtOperator = dsOperator.Tables[0];
                var query1 =
                    from rPerm in dtPERMISSION.AsEnumerable()
                    join rOpera in dtOperator.AsEnumerable()
                    on rPerm.Field<string>("openerName") equals rOpera.Field<Int32>("Id").ToString()
                    into newTable
                    from aa in newTable.DefaultIfEmpty()                                              
                    join rOpera2 in dtOperator.AsEnumerable()
                    on rPerm.Field<string>("closeName") equals rOpera2.Field<Int32>("Id").ToString()
                    into newTable2
                    from bb in newTable2.DefaultIfEmpty()
                    select new
                        {
                            qyid = rPerm.Field<String>("qyid"),
                            openerName = (aa==null || string.IsNullOrEmpty(aa.Field<String>("UserName"))) ? "" : aa.Field<String>("UserName"),
                            closeName = (bb==null || string.IsNullOrEmpty(bb.Field<String>("UserName"))) ? "" : bb.Field<String>("UserName")
                        };

                DataTable dt = dtPERMISSION.Clone();
                 dt.Columns.Add("check", System.Type.GetType("System.Boolean"));
                foreach (var obj in query1)
                {
                    dt.Rows.Add(obj.qyid, obj.openerName, obj.closeName, flg);
                }

DefaultIfEmpty操作符,它能够为实序列提供一个默认的元素。DefaultIfEmpty使用了泛型中的default关键字。default关键字对于引用类型将返回null,而对于值类型则返回0。对于结构体类型,则会根据其成员类型将它们相应地初始化为null(引用类型)或0(值类型 

bb==null || string.IsNullOrEmpty(bb.Field<String>("UserName")
判断左连接的对象是否为空,否则直接赋值会报错

foreach (var obj in query1)
                {
                    dt.Rows.Add(obj.qyid, obj.openerName, obj.closeName, flg);
                }

LINQ查询后的对象,用了NEW不能直接用CopyToDataTable(),所以用FOR循环赋值。


项目中用到的小技巧,以此记录。



  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值