泛型委託與單獨lambda查詢異同

2022-02-20 07:47:50 字數 1422 閱讀 9435

前兩天為oa系統新增了登入日誌,登入型別分三類:工業園ip登入、同步ip登入、簡訊驗證碼登入,寫日誌之前先判斷使用者賬號是否存在是否允許登入繼而是否是合法ip位址繼而密碼是否正確,如果是非工業園ip登入判斷其簡訊驗證碼是否正確,以上驗證都通過才寫入日誌記session,  測試正常即發布。上線後研究登入日誌資料發現了奇怪的資料:型別為簡訊驗證碼登入但是並沒有其他使用者資訊,而我在登入成功後都會記錄登入賬號、工號、時間、ip、登入結果等資訊,斷點除錯**也沒有發現問題。遂在寫日誌的時候又加了層驗證使用者賬號和密碼如果不成功返回「warning,非法登入請自行離去」,今早發布後終於有同事反饋oa無法登入並截圖發給我,我發現他的登入賬號含有大寫字母而我們資料庫中所有賬號皆是小寫,遂用該賬號測試登入,果真發現問題根源……

先介紹下oa系統架構方面,我們使用mvc5+ef+mysql,在底層封裝了返回實體方法:   

public iqueryableloadentities(funcwherelambda)

問題就出在這個泛型委託引數wherelambda(不要問我為什麼不用表示式查詢,因為呼叫該方法的地方實在太多了……而且很多地方都用了型別轉換), 而我新增的驗證使用者方法確實呼叫了該方法

hr_employee emp = emp_biz.loadentities(t => t.uid == model.userid && t.pwd == pwd).firstordefault();(注:pwd是經過加密的),當使用大寫的賬號登入時emp為null,而我在寫日誌之前的判斷使用者是否存在和密碼是否正確時用的是直接linq查詢hr_employee   emp = dbcontext.hr_employee.where(t => t.uid == uid).firstordefault(); 囉裡囉嗦到寫到現在相信大家都發現了問題根源,也一定知道為何如此,但是不是像我一樣不大確定呢,那我們就用事實說話。我的猜想:問題就出在泛型委託上,它本身就是個方法,「==」對等條件就是兩邊必須一致才返回true,而單純的linq where 查詢就是sql語句。下面驗證猜想。

1.func

public actionresult index()

public iqueryableloadentities(funcwherelambda)

前台輸出:

2.linq查詢     

public actionresult index()

//list = loadentities(t =>t.name=="sean").tolist();

return view(list);

}

前台輸出:

由此證明猜想。 

C 泛型委託與Lambda總結

命名方法委託 class mydelegatetest name public static void main 匿名方法委託 class anonymousdelegate mydelegate michael console.readline lambda表示式 lambda表示式是c 3.0的...

泛型委託 Lambda表示式

發信人 joshuag 秦之魅 加菲 我懷念的 信區 dotnet 標 題 閃電,看這個,泛型委託 lambda表示式 發信站 武漢白雲黃鶴站 2008年01月21日15 46 01 星期一 站內信件 我覺得你給出的那個委託的第二個引數不需要用泛型,這樣 public delegate void g...

C 泛型與委託

在函式中的定義 private t myfunc t a 如上,在泛型不能直接和其他型別的資料進行操作,需要先將泛型轉化為轉化為另外乙個運算元的型別,之後轉化為object,再強制轉化為t 具體的型別不能直接轉化為泛型 對委託的函式定義如下 private t myfunc t a 只要和委託的引數...