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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/4 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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%') ?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。