【问题标题】:Entity: Return set of records that are in a subset of an array实体:返回数组子集中的记录集
【发布时间】:2015-10-11 16:43:40
【问题描述】:

我有三个表:Student、Course 和 StudentCourse。 StudentCourse 只是一个联结表(也称为边表、链接表等),其中包含行的唯一 ID 以及学生 ID 和课程 ID。

我有一个代表课程的整数数组,因此输入可能只是 1、2、3。 (这将来自对 REST API 的 GET 请求,但来源并不重要)。

给定一个整数数组,我想返回与数组中所有课程 ID 相关联的所有学生。但是,我仍然想退回那些可能没有通过课程 ID 的学生,因为他们甚至没有那么多关联。

为了概括这一点,假设我们有以下内容:

学生 1 有课程 1,2

Student2 有课程 2,3,4

我传入一个包含 1,2,3 的数组。即使 Student1 没有课程 ID 3,它们仍应返回(它们的课程列表是我传入的课程列表)。

【问题讨论】:

  • 但是,我仍然想返回那些可能没有通过课程 ID 的学生 - 所以从技术上讲,你需要它来返回所有学生- 要么是你必须在数据库中输入的所有学生。
  • 顺便说一句,在这里发布您尝试过的代码。我现在可能有点明白你的意思了。您想要的可能是让所有学生参加通过 id 列表指定的课程中的至少一门课程
  • 不完全是,我基本上希望所有学生都是我传入的 id 数组的子集。
  • 如果我上面的第二条评论是你想要的,你应该发布一些你现在拥有的代码(至少是关于你的模型的一些东西),我可能会有所帮助。
  • 不是,因为它不是“至少一个”,而是所有的 id,除了那些 Student 甚至没有关联的那些。使用上面的示例,如果我传入 1,则不会返回任何内容,因为未传入 2。1,2,3 将返回 Student1,因为传入了 1 和 2,但我们忽略了 3

标签: c# entity-framework linq


【解决方案1】:

假设您有Student 实体和Course 实体。如果您正确设计模型,Student 应该公开CoursesCourse 应该公开Students

查询可以是这样的(使用Contains):

//the input courseIDs
var courseIDs = new [] { 1,2,3 };
var students = Students.Where(e => e.Courses.All(x => 
                                     courseIDs.Contains(x.ID)).ToList();

这是另一个使用Except的查询:

var students = Students.Where(e => e.Courses.Select(x => x.ID)
                                    .Except(courseIDs).Count() == 0)
                                    .ToList();

【讨论】:

    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2018-01-09
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多