c# - 使用 SelectMany 和 GroupBy

标签 c# entity-framework linq linq-to-entities

以下 ProjectEnrolment 定义项目中的用户及其在其中的注册类型:

public class ProjectEnrolment {
  public Project Project { get; set; }
  public User User { get; set; }
  public EnrolmentType EnrolmentType { get; set; }
}

出于测试目的,我需要创建一个 ProjectEnrolments 列表,其中:
1. 每个项目必须有多个ProjectEnrolment;
2. 一个用户不能在一个项目中出现两次。

我尝试了以下方法:

List<ProjectEnrolment> projectEnrolments = 
  projects.SelectMany(x => 
  users.SelectMany(y => 
  enrolmentTypes.Select(z => 
    new ProjectEnrolment {
      EnrolmentType = z,
      Project = x,
      User = y
    })))          
  .GroupBy(u => u.Project)          
  .Select(v => v.OrderBy(w => Guid.NewGuid()).FirstOrDefault())
  .ToList();  

但这为我提供了每个项目一个 ProjectEnrolment,这不是我所需要的。

最佳答案

虽然我可能不会使用 SelectMany 和其他 linq 方法在一条指令中执行您想要的操作。这是一个相当复杂的逻辑,最终的指令将不可读。这个怎么样:

Random r = new Random();
IList<ProjectEnrolment> projectEnrolments = new List<ProjectEnrolment>();
foreach (Project project in projects)
{
    int firstUser = r.Next(users.Count);
    projectEnrolments.Add(new ProjectEnrolment {
        EnrolmentType = enrolmentTypes[r.Next(enrolmentTypes.Count)],
        Project = project,
        User = users[firstUser]
    });
    int secondUser;
    do {
        secondUser = r.Next(users.Count);
    } while (secondUser == firstUser);
    projectEnrolments.Add(new ProjectEnrolment {
        EnrolmentType = enrolmentTypes[r.Next(enrolmentTypes.Count)],
        Project = project,
        User = users[secondUser]
    });
}

使用 Linq 的版本

IList<ProjectEnrolment> projectEnrolments = projects.SelectMany(p => users.OrderBy(u => Guid.NewGuid()).Take(2).Select(u => new ProjectEnrolment {
    EnrolmentType = enrolmentTypes.OrderBy(t => Guid.NewGuid()).FirstOrDefault(),
    Project = p,
    User = u
})).ToList();

关于c# - 使用 SelectMany 和 GroupBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43661143/

相关文章:

c# - 如何回滚 WebAPI 中保存的更改

c# - 如何用 lambda 表达式连接 3 个表?

c# - 使用 SQLiteDataReader 的异常

.NET Entity Framework FirstOrDefaultAsync 抛出强制转换错误

c# - 这是一条什么样的路呢?

entity-framework - 如何使用Include限制相关数据的数量

linq - EF Core 3、OrderByDescending 和 ThenBy rerurn 错误无法转换

c# - 将项目移动到数组中的第一个

c# - 为什么仅指定列的子集时 MigrationHistory 会导致 Linq 结果不同?

c# - 不支持 'Microsoft.AspNetCore.Http.IHeaderDictionary' 上的集合类型 'Microsoft.AspNetCore.Http.IFormFile.Headers'