EF Core 3.0查询
隨著.NET Core 3.0的發(fā)布,EF Core 3.0也隨之正式發(fā)布,關(guān)于這一塊最近一段時(shí)間也沒(méi)太多去關(guān)注,陸續(xù)會(huì)去對(duì)比之前版本有什么變化沒(méi)有,本節(jié)我們來(lái)看下兩個(gè)查詢。
分組
我們知道在EF Core 3.0版本之前,對(duì)于分組查詢是在客戶端評(píng)估,也就是說(shuō)在內(nèi)存中操作,在EF Core 3.0版本后對(duì)于分組查詢可以翻譯成SQL在數(shù)據(jù)庫(kù)進(jìn)行,但是事實(shí)情況真的是這樣嗎?接下來(lái)我們來(lái)看下吧,如下給出代碼例子。
接下來(lái)我們?cè)诳刂婆_(tái)進(jìn)行如下查詢:
上述我們查詢每一篇博客的文章數(shù)組,我們通過(guò)SQL Profiler跟蹤到上述示例代碼最終翻譯成的SQL如我們所期望的那樣,如下圖:
假設(shè)現(xiàn)在有這樣一個(gè)場(chǎng)景:查詢所有博客發(fā)表的第一篇博客文章。基于這種場(chǎng)景我們需要對(duì)發(fā)表博客文章進(jìn)行分組,然后取第一篇,所以接下來(lái)我們進(jìn)行如下查詢:
既然這樣無(wú)法翻譯,根據(jù)官方文檔可以使用Linq to Object進(jìn)行查詢《https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/》 ,那么我們就修改成如下代碼查詢看看:
咋客戶端都無(wú)法支持了呢?我們只是想查詢所有博客列表中第一篇文章,按照我們的理解,理論上是可以進(jìn)行翻譯的對(duì)不對(duì),比如翻譯成如下直接寫(xiě)的SQL語(yǔ)句:
所以到這里我們大概可以猜測(cè)出EF Core對(duì)分組查詢支持的并不是那么好,目前應(yīng)該只支持簡(jiǎn)單的分組求和而已,稍微復(fù)雜一點(diǎn)則無(wú)法翻譯,所以我們還是老老實(shí)實(shí)將分組還是完全放在客戶端評(píng)估吧,如下:
查找
我們可以通過(guò)EF.Functions.Like來(lái)進(jìn)行模糊查詢,我們可以通過(guò)StartWith或EndWith來(lái)查詢開(kāi)頭或結(jié)尾的數(shù)據(jù),要是現(xiàn)在需要查詢出博客文章標(biāo)題中包含某一字符的文章列表,我們又該如何查詢呢?我們想到通過(guò)IndexOf來(lái)查詢,接下來(lái)我們來(lái)看看:
難道我們又只能將所有查詢出來(lái),然后在內(nèi)存中操作嗎?代碼如下:
其實(shí)我們只要將上述單引號(hào)修改雙引號(hào)即可解決完全在客戶端評(píng)估的問(wèn)題,如下:
根據(jù)我們的查詢描述,我們明明是想查詢?cè)跇?biāo)題中查詢指定字符,為何對(duì)字符不能支持,只支持字符串呢,不知道官方是出于何種原因。同時(shí)這里我們也注意到,無(wú)論是MySQL還是SQL Server等等,盡量不要將表中列設(shè)置為可空,即使是可空也要設(shè)置為不可空,給定一個(gè)默認(rèn)值即可,一旦數(shù)據(jù)量巨大時(shí),會(huì)發(fā)現(xiàn)查詢很慢,因?yàn)橥ㄟ^(guò)IS NULL或者IS NOT NULL不走索引導(dǎo)致。比如上述我們查詢的Title,我們無(wú)論是通過(guò)Data Annotations還是Fluent Api,都必須配置成不可空,比如這里我們通過(guò)Data Annotations配置如下:
此時(shí)我們繼續(xù)進(jìn)行上述查詢時(shí)候,會(huì)發(fā)現(xiàn)對(duì)空值的判斷已經(jīng)沒(méi)有了,同時(shí)也減少了查詢語(yǔ)句,如下:
請(qǐng)注意上述我所演示EF Core版本為3.0.1。本節(jié)我也只是通過(guò)簡(jiǎn)單的示例稍微給大家看了EF Core 3中一些小的問(wèn)題,當(dāng)然可能還存在其他的問(wèn)題,更多細(xì)節(jié)等我后續(xù)研究會(huì)繼續(xù)給出EF Core 3.x系列文章,感謝您的閱讀,若有敘述不當(dāng)或錯(cuò)誤之處,還望指正,謝謝。
總結(jié)
以上是生活随笔為你收集整理的EF Core 3.0查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 分享一次与SharpDX坑爹Bug刚正面
- 下一篇: 程序员修神之路--容器技术为什么会这么流