c# - EF Core 自定义扩展查询,无法翻译 LINQ 表达式
问题描述
我怎么能做这样的事情?
public static class CustomExtensions
{
public static IQueryable<TEntity> CustomWhere<TEntity>(this
IQueryable<TEntity> entities,
Expression<Func<TEntity, bool>> getProperty,
bool isTrue)
{
return isTrue ? entities : entities.Where(getProperty);
}
}
var users = (
from user in _context.Users
let userChange = _context.UsersChange.CustomWhere(e => e.RegisterName == request.RegisterName,
string.IsNullOrEmpty(request.RegisterName)).FirstOrDefault()
select new
{
test = userChange
}).FirstOrDefault();
现在我有错误“无法翻译 LINQ 表达式。要么以可翻译的形式重写查询,要么切换到客户端评估 EF Core 3.1”
解决方案
自定义扩展方法只能与顶级可查询对象一起使用,因为这是它们实际执行的唯一情况。当在查询表达式树中使用时(如您的示例中),“调用”只是被记录,但从未被调用,并且在翻译期间它们被视为任何未知方法。
因此,解决方案是将调用(当然在可能的情况下)移动到顶级查询变量,然后在实际查询中使用该变量,例如
var userChanges = _context.UsersChange
.CustomWhere(e => e.RegisterName == request.RegisterName,
string.IsNullOrEmpty(request.RegisterName));
// Note that the above just defines a query without executing it
// Now it can be used inside the main query
var users = (
from user in _context.Users
let userChange = userChanges.FirstOrDefault()
select new
{
test = userChange
}
);
推荐阅读
- amazon-web-services - AWS - 回溯 Aurora 数据库
- python - queue.py 中 Queue 类的功能是什么?
- google-colaboratory - Google Colab:如何挂载特定文件夹而不是挂载根文件夹?
- linux - 无法在 Ubuntu 命令行中启动 WebdriverIO
- java - sql插入中单引号的正则表达式
- simulink - 如何在simulink中更改任务优先级
- ios - 如果不在客户端以确保安全,我应该在哪里存储我的 FCM 服务器密钥?IOS?
- asp.net-mvc - 下拉列表未在编辑页面上显示值
- javascript - 在重定向的页面中出现 Redux 状态错误
- sql - 如何在从另一个表中提取数据时创建具有约束的表