【问题标题】:Linq Query from Same table with multiple conditions来自具有多个条件的同一张表的 Linq 查询
【发布时间】:2018-07-06 13:42:20
【问题描述】:

我正在尝试的当前查询是

 public async Task<ActionStatus<IList<SelectedListViewModel>>> GetProjectMembersByClient(Guid clientId)
    {
var userProjects = _unitofwork.UserProjects;
        var ProjectIds = userProjects.Get(filter: x => x.UserId == clientId).Select(y=> new UserProjects {UserId=y.UserId,ProjectId=y.ProjectId });
}

我的表格格式是(表格名称:“UserProject”)

MapId projectId UserID
1      123       89
2      123       69
3      123       36

我想在传递用户 ID 时获取所有包含相同项目 ID 的用户 ID。

例如:如果我的参数是 89(对应的 projectid 是 123),我想获得 69 和 36 作为我的新“UserProjects”模型。

注意:userid 可能有多个 projectid,在这种情况下还想从选定的 projectid 中获取所有成员

【问题讨论】:

  • 你为什么按 UserID 而不是 ProjectID 过滤?
  • userId 是整数,为什么 clientId 是 guid? (x.UserId == clientId)
  • 对不起,用户 id 是一个 Guid。

标签: c# entity-framework linq linq-to-sql


【解决方案1】:

你可以用下面的Linq得到这样的数据集。

var userIds = userProjects
    .GroupBy(m => m.ProjectId)
    .Where(g => g.Any(m => m.UserId == userId))
    .SelectMany(g => g.Select(m => m.UserId))
    .Distinct();

这会产生与 bit 的解决方案 + Distinct() 相同的结果。但是,我想知道它们在运行时会有多少不同。因此,我只是将处理时间与 10,000 条记录(每次随机生成)的数据的两个代码进行了 100 次比较。结果是我上面的解决方案快了大约 1.5 倍(或更多)。这是 macOS 10.13.5 上单声道 5.10.1.57 的结果。如果性能对您很重要,请在您的环境中尝试。

【讨论】:

  • 提前谢谢,我没有尝试,但我认为它会解决我的问题,你能告诉我在这个查询中使用 Distinct 的解释吗?
  • distinct 删除数据集中的重复。例如,userId 的用户(用户 A)属于三个项目,而另一个用户属于其中两个项目(用户 B)。在这种情况下,上面 Linq 的结果包含三个用户 A 和两个用户 B。 Distinct 删除了这种重复,并在结果中留下了一个用户 A 和一个用户 B。我猜想这种重复不是你想要的,所以我在这个答案中使用了它。
  • 很好的解释 yas Ikeda。谢谢
【解决方案2】:

忽略拼写错误并假设userIdclientId 是数字。 先获取你需要的projectIds

var projectIds = _unitofwork.UserProjects.Where(p=>p.UserId==clientId).Select(p=>p.ProjectId);

然后获取与projectIds相关联的用户ID;像这样:

var userIds = _unitofwork.UserProjects.Where(p=>projectIds.Contains(p.ProjectId)).Select(p=>p.UserId);

【讨论】:

    猜你喜欢
    • 2022-06-30
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    相关资源
    最近更新 更多