EF查询 - SQL“IN” - 相同表

时间:2014-10-10 17:53:31

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

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

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

下面的查询显然会获得UserOrganization匹配传递给查询的值的所有活动OrganizationId记录。所以我的问题是,我如何知道当前用户(UserId)并确保它们存在于此结果集中,然后返回他们无法看到的记录?

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

2 个答案:

答案 0 :(得分:2)

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

如果您无法通过Users看到Organization,可以执行以下操作:

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)

答案 1 :(得分:0)

最简单的方法是检查当前用户是否具有该关系,并决定是否要继续。这节省了必须进行可能昂贵的数据库操作:

var hasRelationship = db.UserOrganisations.Any(uo => 
                          uo.UserId == currentUserId && 
                          uo.OrganizationId == organizationId);

if(hasRelationship) 
{
    //Interesting stuff here
}
else 
{
    //No access
}