不支持MongoDB投影toListAsync()方法

时间:2018-10-12 04:25:09

标签: c# mongodb mongodb-query aggregation-framework

我正在尝试在查询中使用投影并得到以下错误:  “不支持结果操作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 :(得分:1)

该行出现问题:

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;
}