Linq -----DataTableJoin查詢(on多個條件的查詢案例)
阿新 • • 發佈:2019-02-16
什麼是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));