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循环赋值。
项目中用到的小技巧,以此记录。