在 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。
我有一个简单的查询,但它抛出了无法翻译的问题
这里是函数
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。