【问题标题】:Am trying to check if the student ClassID and the Class_Schedule ClassID match我正在尝试检查学生 ClassID 和 Class_Schedule ClassID 是否匹配
【发布时间】:2020-06-04 18:10:30
【问题描述】:
var sched = db.Class_Schedule.Select(p=>p.ClassID);

var classStudents = db.Students.Where(p => p.Enrollments.Select(q=>q.ClassID).Equals(sched));
return View(classStudents.ToList());

我正在尝试通过注册表检查学生的ClassID,看看它是否与Class_Schedule 表的ClassID 匹配。

这是我得到的例外:

'System.NotSupportedException: '无法比较'System.Collections.Generic.IEnumerable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 类型的元素。仅支持原始类型、枚举类型和实体类型。''

【问题讨论】:

  • 类似于TSQL语法。您想使用Where 进行过滤,并使用Select 实际指定要检索的内容(如果它与实体类型不同)。您还可以使用Join 跨表连接。至于您实际上要做什么,我不确定,因为您提到了Student(单数),但是您在陈述中没有使用学生ID或学生实例。

标签: c# sql .net model-view-controller


【解决方案1】:

使用Intersect

var sched = db.Class_Schedule.Select(p => p.ClassID).ToList();
var classStudents = db.Students.Where(p => p.Enrollments.Select(q=>q.ClassID).ToList().Intersect(sched).Any());

【讨论】:

  • intersect 方法不起作用我得到错误,'列表不包含 intersect() 的定义
  • 添加System.Linq;命名空间
【解决方案2】:

您的示例中的schedIEnumerable<string> 类型,p.Enrollments.Select(q=>q.ClassID) 的结果也是。但是,.Equals() 只能比较原始类型(字符串、int 等),但您在 IEnumerable 上使用 IEnumerable 参数调用它,所以它失败了。

您想要做的是搜索他们有Any 注册在他们的日程安排中的学生。所以改为尝试

var classStudents = db.Students.Where(s => s.Enrollments.Any(e => sched.Contains(e.ClassID)));

【讨论】:

  • 无法将 int 类型与 bool 进行比较
  • 您能详细说明一下吗?错误发生在哪里? EnrollemntsClass_Schedule 数组有哪些类型?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 2013-12-30
  • 2012-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多