Есть несколько способов добиться того, чего вы хотите, исходя из того, что вы уже убрали пользователей из БД. Учитывая это, я не знаю ни одного метода для достижения этого с одним запросом БД.
Я создал простой пример для проверки результата запроса, но вы можете заменить переменные на свои.
Решение 1 - Не рекомендуется
static void Main(string[] args)
{
// Sample Data
var allUsers = new List<User>
{
new User{Id = 1, Name = "User X"},
new User{Id = 2, Name = "User Y"},
new User{Id = 3, Name = "User Z"},
new User{Id = 4, Name = "User W"}
};
var userInterests = new List<UserInterest>
{
new UserInterest {FakeId = 1, UserId = 1, CategoryId = 1},
new UserInterest {FakeId = 2,UserId = 1, CategoryId = 2},
new UserInterest {FakeId = 3,UserId = 1, CategoryId = 3},
new UserInterest {FakeId = 4,UserId = 2, CategoryId = 1},
new UserInterest {FakeId = 5,UserId = 2, CategoryId = 2},
new UserInterest {FakeId = 6,UserId = 3, CategoryId = 1},
new UserInterest {FakeId = 7,UserId = 3, CategoryId = 4}
};
var interests = "1 2";
var interestsFilter = interests.Split(" ").ToList();
var unwantedUserIds = userInterests.Where(q => interestsFilter.All(q2 => q.CategoryId != int.Parse(q2)))
.Select(q => q.UserId).Distinct();
// Get All users ids that match the filter
var myUserIds = userInterests.Where(q => unwantedUserIds.All(q2 => q.UserId != q2))
.Select(q => q.UserId).Distinct();
// Or Get the users directly
var myUsers = allUsers.Join(userInterests,
user => user.Id,
userInterest => userInterest.UserId,
(user, userInterest) => user).Where(q => unwantedUserIds.All(q2 => q.Id != q2)).Distinct();
}
Решение 2 - Необработанный Sql
Поскольку вы используете платформу сущностей и до тех пор, пока Вы можете достичь результатов с помощью одного запроса к БД, который вы go Raw Sql в случае, если Linq не смог это сделать.
Сырье Sql