亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Func 和 Expression Func 運行查詢之間的區別

使用 Func 和 Expression Func 運行查詢之間的區別

C#
冉冉說 2021-10-31 11:04:37
我一直在互聯網上搜索以找出 Func 和 Expression Func 之間的區別,不知何故我明白了,第一個只是一個函數獲取數據然后在內存中應用該函數但第二個將其轉換為 sql 并運行它在數據庫中,在我運行這兩個查詢之后: public IEnumerable<T> SelectAll(Expression< Func<T, bool>> predicate)    {                 return table.Where(predicate).ToList();    }     public IEnumerable<T> SelectAll(Func<T, bool> predicate)    {        return table.Where(predicate).ToList();    }我把斷點放在返回上,第一個它返回 12 行,第二個它返回 1200 行,謂詞是:s=>s.id="12345"第二個,在獲取數據后應用謂詞,我的問題是,我們在處理數據庫時通常應該使用表達式 func 嗎?
查看完整描述

2 回答

?
慕俠2389804

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 查詢,而不是獲取大量的數據庫條目并在您的代碼中過濾它們。


查看完整回答
反對 回復 2021-10-31
  • 2 回答
  • 0 關注
  • 226 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號