簡體   English   中英

如何通過復雜的LINQ避免EF Core中的RelationalEventId.QueryClientEvaluationWarning?

[英]How to avoid RelationalEventId.QueryClientEvaluationWarning in EF Core with complex LINQ?

當前,我有一個LINQ語句,其中Entity Framework Core會發出警告: 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM