Как сделать левое/правое соединение с помощью 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.

0 ответов

Другие вопросы по тегам