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循环赋值。


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



阅读更多
博主设置当前文章不允许评论。
换一批

没有更多推荐了,返回首页