Как сделать левое/правое соединение с помощью DbSet
У меня есть следующие 3 модели:
class Owner
{
public Guid Id { get; set; }
public IList<AccessShare> AccessShares { get; set; } = new List<AccessShare>()
}
class AccessShare
{
public Guid OwnerId { get; set; }
public Guid AccessorId { get; set; }
}
class File
{
public Guid OwnerId { get; set; }
public Owner Owner { get; set; }
public string Filename { get; set; }
}
Целью системы является назначение права собственности на файлы одному пользователю и предоставление другим пользователям возможности видеть эти объекты только при наличии AccessShare от Accessor к Owner.
У меня есть следующий код, который я использую для возврата файла:
Guid fileId = <code that gets the accessor id>
Guid accessorId = <code that gets the accessor id>
File? file = DBContext
.Set<File>()
.Where(e => e.Id == fileId)
.Where(e => e.Owner.Id == accessorId || e.Owner.AccessShares.Any(a => a.AccessorId == accessorId))
.Include(e => e.Owner)
.Include(e => e.Owner.AccessShares)
.FirstOrDefault();
Проблема, которую я получаю, заключается в том, что если возвращается нуль, я не знаю, потому что нет объекта File с данным идентификатором или если нет общего доступа, который разрешает доступ.
Если бы это был необработанный SQL, я бы выполнил левое соединение от владельцев к AccessShares с указанным выше условием, это всегда возвращало бы мне файл/владельца, если он был найден, а затем, возможно, любые общие ресурсы доступа, которые соответствуют критериям.
Я могу найти примеры того, как это сделать в SQL и в Linq, но я не могу найти примеры с использованием гибкого стиля DbSet.