首页 > 解决方案 > 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”

标签: c#asp.netentity-frameworkentity-framework-core

解决方案


自定义扩展方法只能顶级可查询对象一起使用,因为这是它们实际执行的唯一情况。当在查询表达式树中使用时(如您的示例中),“调用”只是被记录,但从未被调用,并且在翻译期间它们被视为任何未知方法。

因此,解决方案是将调用(当然在可能的情况下)移动到顶级查询变量,然后在实际查询中使用该变量,例如

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
    }
);

推荐阅读