C# 具有多个条件的同一表的Linq查询
我正在尝试的当前查询是C# 具有多个条件的同一表的Linq查询,c#,entity-framework,linq,linq-to-sql,C#,Entity Framework,Linq,Linq To Sql,我正在尝试的当前查询是 public async Task<ActionStatus<IList<SelectedListViewModel>>> GetProjectMembersByClient(Guid clientId) { var userProjects = _unitofwork.UserProjects; var ProjectIds = userProjects.Get(filter: x => x.UserI
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 });
}
当我传递一个userid时,我想得到所有包含相同projectid的userid
例如:如果我的参数是89(对应的projectid是123),我想得到69和36作为我的新“UserProjects”模型
注意:userid可能有多个projectid,在这种情况下,还希望从所选projectid中获取所有成员,忽略键入,并假设
userid
和clientId
是数字。
首先获取所需的项目
var projectIds = _unitofwork.UserProjects.Where(p=>p.UserId==clientId).Select(p=>p.ProjectId);
然后获取与那些项目相关联的用户ID
;大概是这样的:
var userIds = _unitofwork.UserProjects.Where(p=>projectIds.Contains(p.ProjectId)).Select(p=>p.UserId);
忽略输入错误并假设
userId
和clientId
是数字。
首先获取所需的项目
var projectIds = _unitofwork.UserProjects.Where(p=>p.UserId==clientId).Select(p=>p.ProjectId);
然后获取与那些项目相关联的用户ID
;大概是这样的:
var userIds = _unitofwork.UserProjects.Where(p=>projectIds.Contains(p.ProjectId)).Select(p=>p.UserId);
您可以使用下面的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()相同的结果。然而,我想知道它们在运行时会有多大的不同。因此,我简单地将处理时间与这两个代码进行了100次比较,以获得10000条记录(每次随机生成)的数据。结果是我上面的解决方案快了大约1.5倍(或更多)。这是macOS 10.13.5上mono 5.10.1.57的结果。如果性能对您很重要,请在您的环境中试用。您可以使用下面的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()相同的结果。然而,我想知道它们在运行时会有多大的不同。因此,我简单地将处理时间与这两个代码进行了100次比较,以获得10000条记录(每次随机生成)的数据。结果是我上面的解决方案快了大约1.5倍(或更多)。这是macOS 10.13.5上mono 5.10.1.57的结果。如果性能对您很重要,请在您的环境中试用。为什么要按UserID而不是ProjectID进行筛选?UserID是整数,clientId为什么是guid?(
x.UserId==clientId
)很抱歉,用户id是Guid。为什么要按用户id而不是ProjectID进行筛选?用户id是整数,为什么clientId是Guid?(x.UserId==clientId
)很抱歉,用户id是Guid。事先谢谢,我没有尝试,但我认为这会解决我的问题,请告诉我在该查询中使用Distinct的解释。Distinct删除数据集中的重复项。例如,userId的用户(用户A)属于三个项目,另一个用户属于其中两个项目(用户B)。在这种情况下,上述Linq的结果包含三个用户A和两个用户B。Distinct将删除此类重复,并在结果中保留一个用户A和一个用户B。我猜这样的复制不是你想要的,所以我在这个答案中使用了它。很好的解释是Ikeda。提前谢谢谢谢,我没有尝试,但我认为这会解决我的问题,你能告诉我在这个查询中使用Distinct的解释吗?Distinct删除数据集中的重复项。例如,userId的用户(用户A)属于三个项目,另一个用户属于其中两个项目(用户B)。在这种情况下,上述Linq的结果包含三个用户A和两个用户B。Distinct将删除此类重复,并在结果中保留一个用户A和一个用户B。我猜这样的复制不是你想要的,所以我在这个答案中使用了它。很好的解释是Ikeda。非常感谢。