【发布时间】:2021-06-26 15:33:02
【问题描述】:
我正在开发一个 net 5 api,并尝试在查询数据库时实现 Iqueryable。我了解 IQueryable 和 IEnumerable 之间的根本区别。一切正常,直到我尝试实现搜索功能,然后我在 Postman 中收到上述消息:要么以可翻译的形式重写查询,要么通过插入对“AsEnumerable”、“AsAsyncEnumerable”的调用显式切换到客户端评估、“ToList”或“ToListAsync”。这是我的代码,感谢任何帮助,请随时指出我代码中的每个错误:
服务:
public async Task<IEnumerable<TransactionsForUserVM>>
ShowTransactionsForSpecificUser2(QueryParameters queryParameters,
string email)
{
IQueryable<TransactionsForUserVM> transactions =
(from t in _context.StockTransactions
join u in _context.Users.Where(u => u.Email == email)
on t.Email equals u.Email
join s in _context.Stocks
on t.StockId equals s.Id
select new TransactionsForUserVM
{
Id = t.Id,
StockId = s.Id,
Stock = s.Symbol,
Quantity = t.Quantity,
Purchase = t.Purchase,
Price = t.Price,
Resolved = t.Resolved,
Date = t.Date,
Email = email
}).AsQueryable().OrderBy(s => s.Date);
if (queryParameters.HasQuery())
{
transactions = transactions
.Where(t => t.Stock.ToLowerInvariant().Contains(queryParameters.Query.ToLowerInvariant()));
}
return await transactions.ToListAsync();
}
控制器:
[HttpGet]
public async Task<ActionResult<IEnumerable<TransactionsForUserVM>>>
GetTransactionsForSpecificUser5(
[FromQuery]QueryParameters queryParameters)
{
var email = HttpContext.User.RetrieveEmailFromPrincipal();
var list = await _transactionService.ShowTransactionsForSpecificUser2(queryParameters,
email);
return Ok(list);
}
【问题讨论】:
-
您引用的错误消息是实体框架错误消息。当您尝试使用 Entity Framework Linq 不支持的函数时会发生这种情况(与普通 Linq 不同的 Linq 风格)。
-
可能是ToLowerInvariant无法翻译。但是通常数据库无论如何都会使用不区分大小写的匹配,所以只需将其删除
-
谢谢伙计,就是这样,我花了很多时间在这上面,特别是因为一切都与 ienumerable 一起工作!