EF架(jia)構(gou)~讓(rang)mysql支持DbFunctions擴展函數(shu)
對于在Linq To Entity里(li)使用(yong)日期(qi)函數(shu)需要DbFunctions里(li)的(de)(de)(de)(de)擴展方(fang)法(fa),而不能使用(yong).net里(li)的(de)(de)(de)(de)日期(qi)函數(shu),因為(wei)linq的(de)(de)(de)(de)代碼(ma)會被(bei)翻(fan)譯成(cheng)SQL發到數(shu)據庫端,如(ru)你的(de)(de)(de)(de).net方(fang)法(fa)對于數(shu)據庫是不知(zhi)道的(de)(de)(de)(de),所以需要使用(yong)DbFunctions里(li)的(de)(de)(de)(de)函數(shu),它是為(wei)sqlserver設計的(de)(de)(de)(de),而如(ru)果(guo)你的(de)(de)(de)(de)數(shu)據源是mysql,那(nei)你就尷尬(ga)了(le),我(wo)開始(shi)以為(wei)Mysql.Data里(li)集成(cheng)了(le)這些擴展函數(shu),可遺憾的(de)(de)(de)(de)是沒有集成(cheng),所以我(wo)們需要使用(yong)其它解決方(fang)案。
DbFunctions里的數據庫函數

支持MySql的解決方案
在mysql里添加對象的自函(han)數函(han)數
BEGIN #返回兩個日期相差月份數 RETURN PERIOD_DIFF(DATE_FORMAT(`to`,'%Y%m'),DATE_FORMAT(`from`,'%Y%m')); END
然后在(zai)linq里使用DbFunctions就可以OK了,不會(hui)出現未定義函(han)數的問題(ti)了
var result =repository.GetModel( i => DbFunctions.DiffMonths(i.CreateDate, DateTime.Now) > 1)
.Take(20)
.ToList();
然后程(cheng)序可以正常使用(yong)了,感(gan)謝各(ge)位(wei)的閱讀!