Проекция MongoDB для метода toListAsync () не поддерживается - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь использовать проекцию в своем запросе и получаю следующую ошибку: «Операция результата MongoDB.Driver.Linq.Expressions.ResultOperators.ListResultOperator не поддерживается».Вот код:

 public async Task<IEnumerable<Listing>> LoadAllUserListings(string userId)
        {
            var result = _context.Listing.Aggregate().Match(l => l.OwnerId == userId || l.Sales.Any(a => a.Owner.Id == userId)).
                 Project(l => new Listing
                 {
                     Id = l.Id,
                     Reference = l.Reference,
                     OwnerId = l.OwnerId,
                     Sales = l.Sales.Where(a => a.Owner.Id == userId || a.Manager.Id == userId).ToList(),
                     Products = l.Products,
                     Status = l.Status,
                     DueDate = l.DueDate
                 }).ToListAsync();

            return await result;
        }

Это не похоже на вызов ToListAsync.Я получил этот фрагмент кода из следующего ответа:

https://stackoverflow.com/questions/50904811/mongodb-c-sharp-filter-and-get-all-subdocuments

Поэтому я использую проекцию, потому что пропускаю некоторые поля, которые пользователь не должен видеть (в зависимости от роли).Буду признателен за любую помощь в этом.

Заранее спасибо.

1 Ответ

0 голосов
/ 15 октября 2018

Проблема возникает в этой строке:

Sales = l.Sales.Where(a => a.Owner.Id == userId || a.Manager.Id == userId).ToList()

Что здесь происходит?Драйвер MongoDB принимает это выражение и пытается преобразовать его в синтаксис структуры агрегации.Есть оператор $ filter , который можно запустить на вложенной коллекции, и драйвер может преобразовать .Where() в этот оператор, однако в конце этого выражения нет ничего, соответствующего .ToList(), и поэтому он терпит неудачу.

Итак, исправление довольно простое: вам просто нужно использовать IEnumerable<T> вместо List<T> для свойства Sales, а затем избавиться от этого .ToList(), чтобы ваш код выглядел следующим образом:

public async Task<IEnumerable<Listing>> LoadAllUserListings(string userId)
{
    var result = _context.Listing.Aggregate().Match(l => l.OwnerId == userId || l.Sales.Any(a => a.Owner.Id == userId)).
            Project(l => new Listing
            {
                Id = l.Id,
                Reference = l.Reference,
                OwnerId = l.OwnerId,
                Sales = l.Sales.Where(a => a.Owner.Id == userId || a.Manager.Id == userId),
                Products = l.Products,
                Status = l.Status,
                DueDate = l.DueDate
            }).ToListAsync();

    return await result;
} 
...