Linq GroupJoin(一)

11 篇文章 0 订阅

我们知道Linq group join 实现 SQL left join .隨意兩個測試用表:

1. 員工工資表  
 EmpId varchar(50), //員工 ID
 DeptId int,//部門ID
 Salary decimal(18,2) //工資

2. 部門表
DeptId int, //部門
DeptName nvarchar(100)//部門名稱

  /// <summary>
    /// Linq GroupJoin  類似于  Sql Left outer join 
    /// </summary>        
    private void btnGroupJoin_Click(object sender, EventArgs e)
    {
        DataSet ds = sqlherpler.GetData("SELECT *FROM DepartMent;SELECT * FROM Employee1", null);
        DataTable dtEmployee = ds.Tables[1];//員工表
        DataTable dtDept = ds.Tables[0]; //部門名稱表

        // Linq 表達式形式。 連接得到 部門名稱
        var query1 = from item1 in dtEmployee.AsEnumerable() // 員工表作為左表
                     join item2 in dtDept.AsEnumerable()// 部門表作為右表
                     on item1.Field<int>("deptId") equals item2.Field<int>("deptId") into g //部門ID相等
                     select new { EmpId = item1.Field<string>("empId"),
                                   DeptName =   g.Select (o=>o.Field <string>("deptName")).FirstOrDefault() ?? "Unknow DepartMent",// g.Any() ? g.First().Field <string>("deptName") : "Unknow DepartMent", //得到 部門名稱                                
                                 Salary = item1.Field<decimal>("salary")
                  };
        dgv1.DataSource = query1.ToList();

        //Lambda 函數形式。連接得到每個部門的員工人數,平均工資
        var query2 = dtDept.AsEnumerable().GroupJoin(dtEmployee.AsEnumerable(),
            item1 => item1.Field<int>("deptId"),
            item2 => item2.Field<int>("deptId"),
            (item1, item2) => new
            {   DeptId = item1.Field<int>("deptId"),
                DeptName = item1.Field<string>("deptName"),
                EmployeeNum = item2.Count()   , //部門員工人數
                SalaryAgv =  item2.Any() ? item2.Average(o=>o.Field<decimal>("salary")).ToString ("0.00") : "0.00" //部門員工平均工資
            }) ;
        dgv2.DataSource = query2.ToList();
    }

在这里插入图片描述

另,如果是多个字段连接:例

var queryNotExistInLoc = from d in dtDownLoad.AsEnumerable()
                                     join l in dtLoc.AsEnumerable()
                                     on new { k1 = Convert.ToString(d["employmentCode"]), k2 = DateTime.Parse(Convert.ToString(d["time"])) }
                                     equals new { k1 = Convert.ToString(l["employmentCode"]), k2 = DateTime.Parse(Convert.ToString(l["ftime"])) }
                                     into ljoin                                    
                                     select new { d, itemCardType = Convert.ToString (ljoin.Select(o => o["cardType"]).FirstOrDefault() ?? "") };var query1 = dtDownLoad.AsEnumerable().GroupJoin(dtLoc.AsEnumerable(),
                 item1 => new { k1 = Convert.ToString(item1["employmentCode"]), k2 = DateTime.Parse(Convert.ToString(item1["time"])) },
                 item2 => new { k1 = Convert.ToString(item2["employmentCode"]), k2 = DateTime.Parse(Convert.ToString(item2["ftime"])) },
                 (item1, item2) => new { item1, itemCardType = Convert.ToString(item2.Select(o => o["cardType"]).FirstOrDefault() ?? "") });
            query1.ToList().ForEach(o =>
        Console.WriteLine(o.itemCardType)
          );
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值