首页 > 解决方案 > 在 lambda 查询中使用“.Any()”会在 .net core EF 项目中引发错误

问题描述

我有这个下面的查询,其中抛出了下面提到的错误,它曾经在另一个项目中工作,但不能在.net核心项目中运行。

var lstAppForm = await _appDBContext.ApplicationForms.Where(qr => appFormViewModel.Any(any => any.kycId == qr.id )).ToListAsync();

无法翻译 LINQ 表达式“DbSet .Where(a => __appFormViewModel_0 .Any(any => any.kycId == a.id))”。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。有关详细信息,请参阅https://go.microsoft.com/fwlink/?linkid=2101038

标签: c#entity-frameworkentity-framework-core

解决方案


问题是表达式不能翻译为 sql,因为appFormViewModel它不是数据库中的实体。它是您的 UI 视图模型,与数据库没有任何直接关系,因此它不应该以任何方式成为您的 EF 查询的一部分。

我们可以做的是将所需数据投影到 EF 查询之外Select,然后在 EF 的 Linq 查询中使用它:

var ids = appFormViewModel.Select(x => x.kycId).ToList();

var lstAppForm = await _appDBContext.ApplicationForms
                      .Where(qr => ids.Contains(qr.id))
                      .ToListAsync();

或者:

var ids = appFormViewModel.Select(x => x.kycId).ToList();

var lstAppForm = await _appDBContext.ApplicationForms
                      .Where(qr => ids.Any(a => a == qr.id))
                      .ToListAsync();

推荐阅读