我有一个C#应用程序(.NET Core 3.1),并且我编写了以下的LINQ表达式。
public ActionResult<bool> GetItems(string title)
{
var items = _service.All.GetItems().OrderByDescending(o => o.Id).Where(w => w.Portal_Id == 1);
if (!string.IsNullOrWhiteSpace(title))
{
var terms = title.Split(' ').ToList();
items = items.Where(w => terms.Any(a => w.ItemName.Contains(a)));
}
// Some Other code
return Ok();
}
每当执行这个表达式时,我都会收到以下错误。
The LINQ expression 'DbSet<PosItem>\r\n .Where(p => !(p.IsDeleted))\r\n
.OrderByDescending(p => p.CreatedAt)\r\n .Where(p => p.Portal_Id == 1)\r\n .Where(p => __terms_1\r\n
.Any(a => p.ItemName.Contains(a)))' could not be translated.
Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by
inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().
See https://go.microsoft.com/fwlink/?linkid=2101038 for more information."
由于数据集过大,我无法添加ToList()并转换为客户端评估,请指导我如何解决此问题而不转换为客户端评估。
谢谢
items.Where(w => terms.Any(a => w.ItemName.Contains(a)))
。您正在测试客户端数组。 - Daniel Dearloveterms.Any()
。您可以使用ExpressionBuilder
和 for/foreach 创建一个Expression
,然后在items.Where(your_new_expression)
中使用新创建的Expression
。 - CleptusContains()
将导致最终SQL查询中出现一个或多个LIKE '%item%'
条件。反过来,这可能会在服务器上轻松执行表扫描。这可能是值得付出的代价,也可能不是。 - Daniel Dearlove