好了,直接進入正題, 我們在使用ef/efcore時,
iqueryable
where
<
tsource
>
(this iqueryable source, expressionbool
>
> predicate)
where的靈活性和不可避開性,我們不得不深入**它和尊重它的存在。我們都喜歡使用where來做自己通用方法的封裝,已是常見有類似這樣的方法封裝:
ienumerable
find
(expressionbool
>
> predicate)
; or
task
>
findasync
(expressionbool
>
> predicate)
;
這很正常,也很好,因為這樣能讓我們動態傳入lambda表示式的靈活性。我們可以這樣呼叫:
var matches = _context.students.
find
(m=>m.yourcolumn == yourvalue...
);
如果你這樣做了,那麼恭喜你,因為你會很順利的編譯通過並快速返回結果值。如下是糟糕的呼叫方式:
private
bool
dynamicparams
(studentinfo model,
requestmodel request)
if(model.teltype ==
999|| model.teltype ==0)
if(model.starttime != model.endtime)
} 。。。。。。
後面還有很多條件要判斷呀。。。
}var matches = _context.yourtables.
find
(m=>
dynamicparams
(studentmodel,requestmodel)
);
這是乙個提供給前端分頁列表頁面呼叫的介面,因為前端傳過來的是多條件查詢,引數有多有少,引數值是空值或有值,為了適應該功能,於是封裝了dynamicparams來滿足功能的需要。
然而,我勸你還是做好正確的ef使用姿態,多看看官方描述的重要提示和警告做法,不要任憑自己的所想所思去寫**。實際上你會發現,上述問題就出在將m=>dynamicparams(studentmodel,requestmodel)作為表示式呼叫而導致資料全盤查詢出來,然後再逐行過濾滿足dynamicparams內的條件後的資料。你應明白一次從資料表中查詢出20w需要消耗多少效能,且你還從這20w的資料中再逐行過濾出滿足你想要的資料!這是非常糟糕的,你要意識到你的無知和愚蠢,與ef沒關係,用不著對你的面試者說ef什麼什麼的。。。
最初我們發現更糟糕的:很多公司的專案中,他們封裝的是這樣的方法:
ienumerable
find
(funcbool
> predicate)
; or
task
>
findasync
(funcbool
> predicate)
;
不用說,封裝成這樣作為公共方法提供給別人呼叫的人,你是災難的創造者,後面導致這個專案大崩潰的罪人應是你,而不是跟你一起開發的人。
現在,讓我們來正確意識ef/efcore中where的正確姿勢:應是expression> predicate作為表示式,而不是funcpredicate。任何情況下都不應偷懶,將類似dynamicparams的封裝作為表示式傳入。
本文只討論where使用,可謂是ef/efcore中的冰山一角,更多正確姿勢請多加閱讀官方文件並實踐出真知,而不是人云亦云。記住一點:微軟一出品,必屬精品!.net開發者最新獲取知識和懂得知識的無非是官方東西,如果你做專案時,以官方東西優先,那麼你好更好招人,並更好做出穩定的產品,亦或能減少加班加點做更多更快的產品。
shape使用正確姿勢
android中常常使用shape來定義控制項的一些顯示屬性,今天看了一些shape的使用,對shape有了大體的了解,稍作總結 先看下面的 solid 實心,就是填充的意思 android color指定填充的顏色 gradient 漸變 android startcolor和android en...
Java日誌正確使用姿勢
前言 關於日誌,在大家的印象中都是比較簡單的,只須引入了相關依賴包,剩下的事情就是在專案中 盡情 的列印我們需要的資訊了。但是往往越簡單的東西越容易讓我們忽視,從而導致一些不該有的bug發生,作為一名嚴謹的程式設計師,怎麼能讓這種事情發生呢?所以下面我們就來了解一下關於日誌的那些正確使用姿勢。正文 ...
Java日誌正確使用姿勢
前言 關於日誌,在大家的印象中都是比較簡單的,只須引入了相關依賴包,剩下的事情就是在專案中 盡情 的列印我們需要的資訊了。但是往往越簡單的東西越容易讓我們忽視,從而導致一些不該有的bug發生,作為一名嚴謹的程式設計師,怎麼能讓這種事情發生呢?所以下面我們就來了解一下關於日誌的那些正確使用姿勢。正文日...