在 EF Core 5.x 中使用委托(谓词)抛出 InvalidOperationException

Use delegate (predicate) in EF Core 5.x throws InvalidOperationException

我有一个简单的查询,但它抛出了无法翻译的问题

这里是函数

    public async Task<Voucher> Get(Predicate<Voucher> predicate)
    {
        try
        {
           var voucher = await _promotionCoreContext.Vouchers.AsNoTracking().FirstOrDefaultAsync(i => predicate(i));
           return voucher;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex.Message);
        }
    }

用法是这样的:

repository.Get(c => c.Code == "abc");

但由于某种原因它无法翻译谓词,但它编译了。

---- System.InvalidOperationException : The LINQ expression 'DbSet() .Where(v => Invoke(__predicate_0, v) )' 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 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

我用atm的套餐

任何人都知道如何在不使用 ToList() 将其设为客户端的情况下解决此问题

IQueryable.FirstOrDefaultAsync takes an Expression<Func<TSource,bool>>, not a Func<TSource,bool>. The Enumerable 扩展方法可以与 Func<TSource,bool> 一起使用,但由于它基本上是一个函数指针,因此 EF 无法将其转换为 SQL。