NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?
生活随笔
收集整理的這篇文章主要介紹了
NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
咨詢區
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();我發現它把linq轉成下面這樣了。
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]我很疑惑的是:為什么會多出下面這一段? 僅僅用一個 like 不就可以了嗎?
(CHARINDEX(@__name_0,?[u0].[Name])?=?1))?OR?(@__name_0?=?N''))回答區
Ivan Stoev:
EF Core 中的sql轉換規則仍然還有很多不足之處,離完美還差的很遠,關于 StartsWith,EndsWith 和 Contains 這些方法的sql轉換,在內部或者外部討論中都被多次提起,比如:github:https://github.com/dotnet/efcore/issues/474 ,如果你想生成你想要的,當前有一個變通的方式,就是一部分 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 提供了一個類sql 的 EF.Functions.Like 幾個方法,你可以把它拼在 Linq Expressions 中,比如下面的例子。
var?likeExpression?=?name+"%"; ...?await?db.ApplicationUsers.Where(u?=>?EF.Functions.Like(u.Name,likeExpression)...點評區
特斯拉最大的毛病就是太便宜,Entity Framework 最大的毛病就是封裝的太狠,sql復雜起來后,原來便捷的sql生成就是此時最大的障礙!????
總結
以上是生活随笔為你收集整理的NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF Treeview第三层横向排列
- 下一篇: String是一个奇怪的引用类型