EF查询-SQL”;IN”-同一张表

本文关键字:一张 -SQL 查询 IN EF | 更新日期: 2023-09-27 18:26:13

我需要获得与Organization有关系的Users的列表,但前提是当前用户与同一Organization有关系。

换言之,如果当前用户与有关组织没有关系,则不会返回任何结果。如果存在关系,则返回结果。这是我现在的查询,但它只检索了一个当前用户。

下面的查询显然将获得所有活动UserOrganization记录,其中OrganizationId与传递给查询的值相匹配。所以我的问题是,在返回他们不应该看到的记录之前,我如何知道我的当前用户(UserId)并确保他们存在于这个结果集中?

var dbUsers = db.UserOrganizations
                    .Where(u => u.OrganizationId == organizationId)
                    .WhereIf(active, u => u.IsActive)

EF查询-SQL”;IN”-同一张表

var dbUsers = db.Organizations
                    .Where(o => o.OrganizationId == organizationId
                     && o.Users.Any(u=>u.UserId == currentUserId && u.IsActive))
                    .SelectMany(o=>o.Users)

如果你不能通过Organization看到Users,你可以做这样的事情:

var dbUsers = db.Organizations
                    .Where(o => o.OrganizationId == organizationId
&& o.UserOrganizations.Any(u=>u.User.UserId == currentUserId && u.User.IsActive))
                    .SelectMany(o=>o.UserOrganizations)
                    .Select(uo=>uo.User)

最简单的方法就是检查当前用户是否有这种关系,并决定是否要继续。这节省了进行潜在的昂贵数据库操作的成本:

var hasRelationship = db.UserOrganisations.Any(uo => 
                          uo.UserId == currentUserId && 
                          uo.OrganizationId == organizationId);
if(hasRelationship) 
{
    //Interesting stuff here
}
else 
{
    //No access
}