如何避免使用复杂 LINQ 的 EF Core 中的 RelationalEventId.QueryClientEval



目前我有一个 LINQ 语句,实体框架核心抛出警告:System.InvalidOperationException: Warning as error exception for warning 'RelationalEventId.QueryClientEvaluationWarning': The LINQ expression '(Invoke(__selector_0, [x]).ToString() == __value_1)' could not be translated and will be evaluated locally.

我已经在数据库上下文初始化中将此"抛出警告作为异常",以强制编写 LINQ 以在服务器端进行评估。

public async Task<int?> ExistsAsync<TValue>(TestModel entity, Func<TestModel, TValue> selector)
{
var value = selector(entity).ToString();
var test = await _context.TestModel.Where(x => selector(x).ToString() == value).Select(x => x.Id).FirstOrDefaultAsync();
return test;
}

上述语句按以下方式使用。

var id = await _service.ExistsAsync(new TestModel {Name = name}, x => x.Name);

有没有办法将其转换为 TSQL 并在服务器端进行评估?使用System.Linq.Expressions


编辑:跟进我在下面回答的问题,哪里有学习System.Linq.Expressions的好资源?我非常了解基本的 LINQ,但是在构建表达式树时,我不知道该去哪里。

我设法通过参考这个答案让它工作。

public async Task<int?> ExistsAsync<TValue>(TestModel entity, Expression<Func<TestModel, TValue>> expression)
{
var selector = expression.Compile();
var value = selector(entity);
var predicate = Expression.Lambda<Func<Equipment, bool>>(Expression.Equal(expression.Body, Expression.Constant(value)), expression.Parameters);
var id= await _context.TestModel.Where(predicate).Select(x => x.Id).FirstOrDefaultAsync();
return id;
}

最新更新