Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有多个条件的同一表的Linq查询_C#_Entity Framework_Linq_Linq To Sql - Fatal编程技术网

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。非常感谢。