Linq多条件关联查询实现方式

2025-11-02 12:23:50

1、1。首先是构造两个Datatable数据集,进行关联 ,这里的两个DateTable,分别包含姓名和日期两个关联字段,但是两个DateTable字段名不一致。数据集1的数据如下

Linq多条件关联查询实现方式

2、数据集2是个基础数据,这个基础数据的数据集如下所示

Linq多条件关联查询实现方式

3、两个数据集准备完毕后,下面是拼接两个数据集的数据

Linq多条件关联查询实现方式

4、由于多关联查询时,需要两个字段的字段名相同,因此此处我们用new同时用两个别名分别代替原先的字段来进行关联。

Linq多条件关联查询实现方式

5、关联查询之后,赋值给相对应的VIewModel,然后把ViewModel传值到界面显示。

Linq多条件关联查询实现方式

6、最终查询出来的结果如下所示。可以看出,以姓名和日期为基本信息,左连接查询考勤信息。

Linq多条件关联查询实现方式

7、这里的源代码如下:

        public List<SignInVM> GetSign(string BeginTime, string EndTime, string Employee)

        {

            OAContext oa = new OAContext();

            DataTable dtUser = CommUtils.GetUserList(BeginTime, EndTime, Employee);

            string where = "";

            if (!string.IsNullOrEmpty(Employee))

            {

                where = string.Format(@" and a.emp_fname like'%{0}%'", Employee);

            }

            string strSQL = string.Format(@"SELECT b.emp_fname, b.depart_name,b.date,b.BeginTime,b.EndTime,

      ( CASE

         WHEN ms = 0

              AND CONVERT(CHAR(10), BeginTime, 108) < '12:00:00' THEN '下班未打卡'

         WHEN ms = 0

              AND CONVERT(CHAR(10), BeginTime, 108) > '12:00:00' THEN '上班未打卡'

         WHEN  540 - ms BETWEEN 0 AND 30 THEN '迟到或早退30分钟以内'

         WHEN 540 - ms > 30 THEN '迟到或早退30分钟以上'

         ELSE '正常'

       END) AS 状态

FROM  (SELECT TOP 100 PERCENT a.emp_fname,

                              b.depart_name,

                              CONVERT(CHAR(10), sign_time, 120)                    date,

                              Min(c.sign_time)                                     AS BeginTime,

                              Max(c.sign_time)                                     AS EndTime,

                              Datediff(minute, Min(c.sign_time), Max(c.sign_time)) AS Ms

       FROM   Employee a

              LEFT JOIN Departs b

                     ON a.depart_id = b.depart_id

              LEFT JOIN TimeRecords c

                     ON a.emp_id = c.emp_id

       WHERE  

               CONVERT(CHAR(10), sign_time, 120) BETWEEN '{0}' AND '{1}' {2} 

              AND a.emp_id IS NOT NULL

       GROUP  BY depart_name,

                 emp_fname,

                 CONVERT(CHAR(10), sign_time, 120)

       ORDER  BY depart_name,

                 emp_fname,

                 CONVERT(CHAR(10), sign_time, 120) ASC) AS b

GROUP  BY emp_fname,

    b.date,

          b.BeginTime,

          b.EndTime,

          depart_name,

  b.ms

ORDER  BY b.depart_name,

          b.emp_fname

 ", BeginTime, EndTime, where);

            DataTable dt = DbNoarkKQSQL.Query(strSQL).Tables[0];

            List<Models.SignInVM> items = (from m in dtUser.AsEnumerable()

                                           join

                                               n in dt.AsEnumerable() on

                                                new { Name = m.Field<string>("UName"), Date = m.Field<string>("WorkDate") } equals 

                                                new { Name = n.Field<string>("emp_fname"), Date = n.Field<string>("date") }

                                               into mn

                                           from x in mn.DefaultIfEmpty()

                                           select new SignInVM

                                           {

                                               Guid = Guid.NewGuid(),

                                               UserName = m.Field<string>("UName"),

                                               Department = m.Field<string>("ONAME"),

                                               Date = m.Field<string>("WorkDate"),

                                               DateType = string.Format(@"{0}({1})", m.Field<string>("DateType"), m.Field<string>("Remark")),

                                               BeginTime = x == null ? null : x.Field<DateTime?>("BeginTime"),

                                               Endtime = x == null ? null : x.Field<DateTime?>("EndTime"),

                                               Status = x == null ? (m.Field<string>("Remark")!="工作日"?"正常":"未打卡") : x.Field<string>("状态"),

                                               Remark = m.Field<string>("Remark"),

                                           }).ToList();

            return items;

        }

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢