我正在尝试在查询中使用投影并得到以下错误: “不支持结果操作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
我使用投影的原因是要忽略一些用户不应该看到的字段(取决于角色)。任何帮助,将不胜感激。
谢谢。
答案 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;
}