2 回答

TA貢獻1719條經驗 獲得超6個贊
AFunc<T>是一個委托,而 aExpression<Func<T>>是一個表達式。
表達式是一種抽象。
一個Expression<T>可以編譯成一個Func<T>:
Expression<Func<int, int>> expr = a => a + 1;
Func<int,int> func = expr.Compile();
var res = func(1); // (1+1) = 2
因此,將表達式視為一種表示表達式的樹。
這棵樹是抽象的,你可以用它做很多事情。
那么,當涉及到 SQL 時,我們如何才能利用這種行為呢?
您可以創建某人(實體框架)將轉換為 SQL 的表達式。
所以當你有一個像這樣的表達式時:
users.Where(u => u.Name.StartsWith("a"));
它可以被翻譯成 SQL,如:
select * from Users where Name like 'a%'
由于有人編寫了將表達式轉換為 sql 的代碼,它支持多種方法但不是全部。因此,有時它會告訴您它無法將您的方法轉換為 SQL,您必須提供一個Expression<Func<T>>替代方法或在 SQL 運行后運行該方法(使用 Linq to Objects)。
最重要的是,在大多數情況下,您更愿意使用表達式而不是 IQueryables,并使用將在數據庫上運行的過濾器創建 SQL 查詢,而不是獲取大量的數據庫條目并在您的代碼中過濾它們。
- 2 回答
- 0 關注
- 226 瀏覽
添加回答
舉報