Linq -----DataTableJoin查询(on多个条件的查询案例)

什么是LINQ

在关系型数据库系统中,数据被组织放入规范化很好的表中,并且通过简单且强大的SQL语言来进行访问。因为数据在表中遵从某些严格的规则,所以SQL可以和它们很好的配合使用。
然而,在程序中却与数据库相反,保存在类对象或结构中的数据差异很大。因此,没有通用的查询语言来从数据结构中获取数据。从对象获取数据的方法一直都是作为程序的一部分而设计的。然而使用LINQ可以很轻松地查询对象集合。

LINQ查询示例

LINQ查询示例:如下代码段实现的功能类似于SQL的右连接查询。且ON有两个关联条件。

首先是两张表做笛卡儿积,再根据cardId和上班时间的年月日和date时间相等两个条件筛选出需要的集合。

 DataTable dt1 = new DataTable();
            dt1.Columns.Add("cardId", typeof(string));
            dt1.Columns.Add("上班时间", typeof(string));
            dt1.Columns.Add("下班时间", typeof(string));
            dt1.Columns.Add("上班状态");
            dt1.Columns.Add("下班状态");
            dt1.Rows.Add("12","2018/08/01 08:00:00","2018/08/01 18:00:00","正常","正常");
            dt1.Rows.Add("12", "2018/08/02 09:00:00", "2018/08/01 17:00:00","正常","早退");
            dt1.Rows.Add("23", "2018/08/01 08:00:00", "2018/08/01 18:00:00", "正常", "正常");
            dt1.Rows.Add("23", "2018/08/02 08:00:00", "2018/08/02 18:00:00", "正常", "正常");
            dt1.Rows.Add("23", "2018/08/03 08:00:00", "2018/08/02 18:00:00", "正常", "正常");
            DataTable dt2 = new DataTable();
            dt2.Columns.Add("cardId", typeof(string));
            dt2.Columns.Add("date", typeof(string));
            dt2.Columns.Add("name", typeof(string));
            dt2.Columns.Add("feature", typeof(string));
            dt2.Rows.Add("12", "2018/08/01", "鸣人", "螺旋丸");
            dt2.Rows.Add("12", "2018/08/02", "鸣人", "螺旋丸");
            dt2.Rows.Add("12", "2018/08/03", "鸣人", "螺旋丸");
            dt2.Rows.Add("23", "2018/08/01", "科比", "篮球");
            dt2.Rows.Add("23", "2018/08/02", "科比", "篮球");
            dt2.Rows.Add("23", "2018/08/03", "科比", "篮球");
            DataTable dt3 = dt2.Clone();
            dt3.Columns.Add("上班时间");
            dt3.Columns.Add("下班时间");
            dt3.Columns.Add("上班状态");
            dt3.Columns.Add("下班状态");
            var result = from a in dt2.AsEnumerable()
                         join b in dt1.AsEnumerable()
                         on new { id = a.Field<string>("cardId"), date = a.Field<string>("date") } equals new { id = b.Field<string>("cardId"), date = Convert.ToDateTime(b.Field<string>("上班时间")).ToString("yyyy/MM/dd") }
                         into g from b in g.DefaultIfEmpty()
                         select new
                         {
                             id = a.Field<string>("cardId"),
                             name = a.Field<string>("name"),
                             date = a.Field<string>("date"),
                             feature = a.Field<string>("feature"),
                             signin = b == null ? "00:00:00" : Convert.ToDateTime(b.Field<string>("上班时间")).ToString("HH:mm:ss"),
                             signback = b == null ? "00:00:00" : Convert.ToDateTime(b.Field<string>("下班时间")).ToString("HH:mm:ss"),
                             status1 = b == null ? "缺卡" : b.Field<string>("上班状态"),
                             status2 = b == null ? "缺卡" : b.Field<string>("下班状态")
                         };
            result.ToList().ForEach(q => dt3.Rows.Add(q.id, q.date, q.name, q.feature, q.signin, q.signback, q.status1, q.status2));

猜你喜欢

转载自blog.csdn.net/ezreal_pan/article/details/81358170
今日推荐