日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ?

發(fā)布時(shí)間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NET问答: LINQ 中为啥不能将 StartsWith() 转成 Like('abc%') ? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

咨詢區(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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。