【问题标题】:LINQ include a subset of a queryLINQ 包含查询的子集
【发布时间】:2020-04-17 14:43:14
【问题描述】:

我在 EF Core 中有一个使用如下结构的实体:

Course 有一个实体 CourseUserRoles,它具有 CourseIdUserIdRoleId >.

CourseViewModelCourse 具有相同的结构,除了 CourseUserRoles 之外,它有两个布尔值 IsAdministrator 和 IsContributor,与 RoleId 相关。

我正在尝试进行一个查询,该查询不会为所查询的每门课程带来所有 CourseUserRoles,而只会为该用户提供特定的课程。

我看到下面的语法是正确的:

query =  query.Include(x => x.CourseUserRoles.Where(y => y.UserId == userId));

查询试图返回课程列表的地方,我只想包括与用户具有相同 ID 的课程。 问题是上面抛出了异常。

是否可以仅在课程具有 UserId 时包含 CourseUserRoles?如果没有,它将返回 null 或空列表。

【问题讨论】:

  • 我认为不可能在 include 方法中传递查询。但是有一个扩展库(EntityFrameworkplus),增加了这个功能entityframework-plus.net/query-include-filter
  • 如果你的数据模型代表这种关系,这意味着你的用户有一个角色和/或案例的集合,你根本不需要查询。这将是在您访问集合时仅加载一个用户的课程的默认行为。

标签: c# .net linq .net-core entity-framework-core


【解决方案1】:

我通常通过创建单独的查询并按如下方式连接来做到这一点:

query = query.Where(x => x.CourseUserRoles.UserId != userId)
var queryWithInclude = query.Where(x => x.CourseUserRoles.UserId == userId)
    .Include(x => x.CourseUserRoles)
var fullDataset = query.Concat(queryWithInclude);

这将两个查询对象保持为 IQueryable 类型而不是 IEnumerable 类型,从而允许在 SQL/服务器端而不是内存中执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多