NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?
咨詢區(qū)
Techy:
我有下面的一段 asp.net core LINQ 代碼。
List<UserSearchResult>?results?=?await?db.ApplicationUsers.Where(u?=>?u.Name.StartsWith(name)?&&?!u.Deleted?&&?u.AppearInSearch).OrderByDescending(u?=>?u.Verified).ThenBy(u?=>?u.DateAdded)?//?Added?to?prevent?duplication?of?results?in?different?pages.Skip(page?*?recordsInPage).Take(recordsInPage).Select(u?=>?new?UserSearchResult(){Name?=?u.Name,Verified?=?u.Verified,PhotoURL?=?u.PhotoURL,UserID?=?u.Id,Subdomain?=?u.Subdomain}).ToListAsync();我發(fā)現(xiàn)它把linq轉(zhuǎn)成下面這樣了。
SELECT?[t].[Name],?[t].[Verified],?[t].[PhotoURL],?[t].[Id],?[t].[Subdomain] FROM?(SELECT?[u0].*FROM?[AspNetUsers]?[u0]WHERE?(([u0].[Name]?LIKE?@__name_0?+?N'%'AND?CHARINDEX(@__name_0,?[u0].[Name])?=?1)OR?@__name_0?=?NULL)AND?[u0].[Deleted]?=?0AND?[u0].[AppearInSearch]?=?1ORDER?BY?[u0].[Verified]?DESC,?[u0].[DateAdded]OFFSET?@__p_1?ROWS?FETCH?NEXT?@__p_2?ROWS?ONLY )?[t]我很疑惑的是:為什么會(huì)多出下面這一段? 僅僅用一個(gè) like 不就可以了嗎?
(CHARINDEX(@__name_0,?[u0].[Name])?=?1))?OR?(@__name_0?=?N''))回答區(qū)
Ivan Stoev:
EF Core 中的sql轉(zhuǎn)換規(guī)則仍然還有很多不足之處,離完美還差的很遠(yuǎn),關(guān)于 StartsWith,EndsWith 和 Contains 這些方法的sql轉(zhuǎn)換,在內(nèi)部或者外部討論中都被多次提起,比如:github:https://github.com/dotnet/efcore/issues/474 ,如果你想生成你想要的,當(dāng)前有一個(gè)變通的方式,就是一部分 sql,一部分 linq ,參考下面的代碼。
var?results?=?await?db.ApplicationUsers//.Where(u?=>?u.Name.StartsWith(name)?&&?!u.Deleted?&&?u.AppearInSearch).FromSql("select?*?from?ApplicationUsers?where?Name?like?{0}",?name?+?"%").Where(!u.Deleted?&&?u.AppearInSearch).OrderByDescending(u?=>?u.Verified).ThenBy(u?=>?u.DateAdded)?//?Added?to?prevent?duplication?of?results?in?different?pages.Skip(page?*?recordsInPage).Take(recordsInPage).Select(u?=>?new?UserSearchResult(){Name?=?u.Name,Verified?=?u.Verified,PhotoURL?=?u.PhotoURL,UserID?=?u.Id,Subdomain?=?u.Subdomain}).ToListAsync();上面的代碼,我就用了 FromSql 做了這樣的定制化。
R.Titov:
Entity Framework 提供了一個(gè)類sql 的 EF.Functions.Like 幾個(gè)方法,你可以把它拼在 Linq Expressions 中,比如下面的例子。
var?likeExpression?=?name+"%"; ...?await?db.ApplicationUsers.Where(u?=>?EF.Functions.Like(u.Name,likeExpression)...點(diǎn)評(píng)區(qū)
特斯拉最大的毛病就是太便宜,Entity Framework 最大的毛病就是封裝的太狠,sql復(fù)雜起來(lái)后,原來(lái)便捷的sql生成就是此時(shí)最大的障礙!????
總結(jié)
以上是生活随笔為你收集整理的NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: WPF Treeview第三层横向排列
- 下一篇: String是一个奇怪的引用类型