У меня есть набор пользователей и посещений. (Так пользователь посещает)Linq left join with group join
Посещение имеет свойство навигации пользователя.
Мне нужно найти пользователей, которые не посещают.
Я могу сделать это, найдя пользователей, которые посещают, находя всех пользователей, а затем принимая во внимание.
Я пытался найти решение, которое выполняется быстрее.
Это то, что я прямо сейчас:
var users = _db.Users.AsNoTracking().Include(c => c.City).Where(x => x.City.Id == city);
var groupedUsers = _db.Visits.AsNoTracking().Include(c => c.City).Include(a=>a.VisitedBy).Where(x => x.City.Id == city).GroupBy(x => x.VisitedBy).Select(group => new { VisitedBy = group.Key, Count = group.Count() });
var visitingUsers = groupedUsers.Select(user => user.VisitedBy);
var dif = users.Except(visitingUsers);
Однако я пытался GroupJoin, как показано ниже:
var results = _db.Users.Include(c => c.City).Where(c => c.City.Id == city).
GroupJoin(_db.Visits.Include(c => c.City).Include(u => u.VisitedBy), u => u.Id, v => v.VisitedBy.Id, (u, v) => new { User = u , Visits = v })
.Select(o=>o.User);
Но это дает мне все пользователи, я хочу, чтобы пользователи, которые надевают» t существует в наборе посещений.
Любая помощь?
Нулевой чек в сочетании с LEFT JOIN обычно выполняет то, что вы пытаетесь ... – Didaxis
где? Не знаю, где я должен поставить нулевую проверку. – DarthVader
В SQL мы делаем: SELECT ... FROM LEFT JOIN b ON (a.X = b.X) WHERE b.X IS NULL'. Нет ли сопоставимого метода Linq для этого? – Didaxis