如何使用lambda表达式将多个表连接到一个表?

时间:2020-02-16 11:43:12

标签: c# linq lambda

我有以下3个表格和模型

表1:学生

+----+-------+---------+
| ID | Name  | Subject |
+----+-------+---------+
| 1  | Alex  | 2       |
+----+-------+---------+
| 2  | Peter | 1       |
+----+-------+---------+
| 3  | Thomas| null    |
+----+-------+---------+

public class Student {

    public int ID {get; set;}
    public string Name {get; set;}
    public int Subject {get; set;}
}

表2:主题

+----+---------+---------+
| ID | Subject | Teacher |
+----+---------+---------+
| 1  | Math    | 5       |
+----+---------+---------+
| 2  | History | 6       |
+----+---------+---------+

public class Subject {

    public int ID {get; set;}
    public string Subject {get; set;}
    public int Teacher {get; set;}
}

表3:老师

+----+---------+---------------+
| ID | TeacherName | Email     |
+----+-------------+-----------+
| 6  | John        | null      |
+----+-------------+-----------+
| 2  | Anna        | anna@aa.c |
+----+-------------+-----------+

public class Teacher {

    public int ID {get; set;}
    public string TeacherName {get; set;}
    public string Email {get; set;}
}

我创建这样的新模型

public class newModel{

    public Student studentList;
    public Teacher teacherList;
    public Subject subjectList;
}

如何将上面的3个表(模型)合并到带有lambda表达式的新表(模型)中?

这意味着我想通过SubjectID将表1加入表2。 然后,表1和表2创建的新表通过教师ID与表3合并。但是,请保留表1中的所有内容。

看起来像

List<newModel> finalList = new List<newModel>();
finalList = db.Student.Join( .... )

finalList的最终结果如下:

+----+--------+---------+-------------+-----------+-------------+-------+
| ID | Name   | Subject | SubjectName | TeacherID | Teachername | Email |
+----+--------+---------+-------------+-----------+-------------+-------+
| 1  | Alex   | 2       | History     | 6         | John        | null  |
+----+--------+---------+-------------+-----------+-------------+-------+
| 2  | Perter | 1       | Math        |           |             |       |
+----+--------+---------+-------------+-----------+-------------+-------+
| 3  | Thomas | null    |             |           |             |       |
+----+--------+---------+-------------+-----------+-------------+-------+

2 个答案:

答案 0 :(得分:3)

首先,如下更新模型:

学生模型:

public class Student
{

    [Key]
    public int Id { get; set; }
    public string Name { get; set; }


    [ForeignKey(nameof(Subject))]
    public int? SubjectId { get; set; }
    public virtual Subject Subject { get; set; } //Navigation Property
}

主题模型:

public class Subject
{
    [Key]
    public int Id { get; set; }
    public string SubjectName { get; set; }


    [ForeignKey(nameof(Teacher))]
    public int TeacherId { get; set; }
    public virtual Teacher Teacher { get; set; } //Navigation Property
}

教师模式:

    public class Teacher
    {
        [Key]
        public int Id { get; set; }
        public string TeacherName { get; set; }
        public string Email { get; set; }
    }

然后Add-Migrationupdate-Database。在所有这些更改之后,您的表将连接在一起,并通过以下查询进行连接,您可以获取这3个表的数据。

var newModel = dbcontext.Students
                .Include(i => i.Subject)
                .ThenInclude(i => i.Teacher)
                .ToList();

现在,根据您的数据,newModel.First().Subject.Teacher.TeacherName的结果为John。最后,当您获取这些数据时,可以将这些数据映射到另一个模型或执行您想要的任何事情。

随时提问。祝你好运。

答案 1 :(得分:0)

如果您具有导航属性,则可以使用#include <ctype.h> #include <math.h> #include <stdio.h> #include <stdlib.h> double evald(const char *s, char **endp) { struct operand { double val; int op, prec; } stack[4], *sp, x; char *p; for (sp = stack;;) { if (*s == '(') { x.val = evald(s + 1, &p); s = p; if (*s == ')') s++; } else { x.val = strtod(s, &p); s = p; } while (isspace((unsigned char)*s)) s++; switch (x.op = *s++) { case '^': x.prec = 3; break; case '*': case '/': case '%': x.prec = 2; break; case '+': case '-': x.prec = 1; break; default: x.prec = 0; x.op = 0; s--; break; } while (sp > stack && x.prec <= sp[-1].prec) { switch ((--sp)->op) { case '^': x.val = pow(sp->val, x.val); break; case '*': x.val = sp->val * x.val; break; case '/': x.val = sp->val / x.val; break; case '%': x.val = fmod(sp->val, x.val); break; case '+': x.val = sp->val + x.val; break; case '-': x.val = sp->val - x.val; break; } } if (!x.op) break; *sp++ = x; } if (endp) *endp = (char *)s; return x.val; } int main(int argc, char *argv[]) { if (argc > 1) { for (int i = 1; i < argc; i++) { printf("%s -> %.17g\n", argv[i], evald(argv[i], NULL)); } } else { char buf[100]; for (;;) { printf("eval> "); fflush(stdout); if (!fgets(buf, sizeof buf, stdin) || (buf[0] == 'q' && buf[1] == '\n')) break; printf(" -> %.17g\n", evald(buf, NULL)); } } return 0; } ,否则可以像下面这样手动加入:

Include()
相关问题