什么是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));