2017-07-10 81 views
0

目前,我有一個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的EF Core中的RelationalEventId.QueryClientEvaluationWarning?

我已經在數據庫上下文初始化把這個「扔警告爲例外」執行寫作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


編輯:跟進質詢,下面我answer,這裏是不錯的學習資源System.Linq.Expressions?我很瞭解基本的LINQ,但是當涉及到構建表達樹的時候,我不知道該去哪裏。

+0

歡迎來到StackOverflow。由於你的問題已被回答(由你)完成。只需接受答案(您自己回答之後需要等待幾天)。如果您還有其他問題,則需要提出一個新問題。不要問主觀問題(如「最佳資源」)。你應該再次通過[tour](https://stackoverflow.com/tour)。 – Trisped

+0

@Trisped我計劃一旦StackOverflow允許我接受我的答案。 – HuntK24

回答

0

我設法通過參考此answer來得到它的工作。

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