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

来源:互联网 发布:汉诺塔非递归算法 php 编辑:程序博客网 时间:2024/06/17 06:57
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循环赋值。


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



原创粉丝点击