2014-10-10 3 views
0

Мне нужно получить список Users, у которого есть отношения с Organization, но только если текущий пользователь имеет отношение к тому же Organization.EF Query - SQL «IN» - та же таблица

Другими словами, если текущий пользователь не имеет отношения к рассматриваемой Организации, результаты не возвращаются. Если есть отношения, результаты возвращаются. Это запрос, который у меня есть прямо сейчас, но он возвращает только одного пользователя, являющегося текущим пользователем.

В результате запроса, очевидно, получите все активные UserOrganization записи, где OrganizationId соответствует значению, переданному в запрос. Итак, мой вопрос: как я могу узнать своего текущего пользователя (UserId) и убедиться, что он существует в этом наборе результатов перед возвратом записей, которые они не могут увидеть?

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

ответ

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) 
0

Самый простой способ - это проверить, имеет ли текущий пользователь эти отношения и решить, хотите ли вы продолжить или нет. Это избавляет от необходимости делать потенциально дорогостоящую операцию базы данных:

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

if(hasRelationship) 
{ 
    //Interesting stuff here 
} 
else 
{ 
    //No access 
} 
Смежные вопросы