我有以下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 | | | | |
+----+--------+---------+-------------+-----------+-------------+-------+
答案 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-Migration
和update-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()