1. 程式人生 > >Linq -----DataTableJoin查詢(on多個條件的查詢案例)

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));