咨询区

  • 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转换规则仍然还有很多不足之处,离完美还差的很远,关于 StartsWithEndsWithContains 这些方法的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%') ?相关推荐

  1. Linq中的Where与SkipWhile

    本文将介绍Linq中的Where与SkipWhile的用法,有时我们容易混淆它们.下面来看一个简单的UnitTest: [TestMethod] public void TestSkipWhileAn ...

  2. LINQ中的Lambda表达式

    Lambda Expressions in LINQ 在第12章,我提到可以用lambda表达式定义内联的委托定义.在如下表达式中: customer => customer.FirstName ...

  3. LINQ中IQueryable 和IEnumberable的区别?用错问题很大。

    为啥要对比IQueryable和IEnumberable呢?有一次项目已经发布到生产环境,但是其中一个列表页面特别的慢,明明在测试环境正常,到线上怎么慢了呢?于是就检查这个页面的代码,表面看linq的 ...

  4. 分层条件关系网络在视频问答VideoQA中的应用:CVPR2020论文解析

    分层条件关系网络在视频问答VideoQA中的应用:CVPR2020论文解析 Hierarchical Conditional Relation Networks for Video Question ...

  5. 用日志记录LINQ中的所有增删改的SQL语句的方法

    我们知道LINQ中的增删改都要调用SubmitChanges方法,我们记录所有SQL的方式就是重写(override)DataContext中的SubmitChanges方法,为了避免每次修改dbml ...

  6. LINQ中ForEach方法的使用

    标签: linq 2016-06-25 12:47 409人阅读 评论(0) 收藏 举报分类: LINQ(5) 我の原创(113) 版权声明:本文为博主原创文章,未经博主允许不得转载.LINQ中For ...

  7. Linq中的group by多表多字段,Sum求和

    Linq中的group by多表多字段,Sum求和 //Line to Sql 写法var data = (from a in Itemsgroup a by new { a.GroupId, a.I ...

  8. C#8.0: 在 LINQ 中支持异步的 IAsyncEnumerableT接口

    C# 8.0中,提供了一种新的IAsyncEnumerable<T>接口,在对集合进行迭代时,支持异步操作.比如在读取文本中的多行字符串时,如果读取每行字符串的时候使用同步方法,那么会导致 ...

  9. Linq中string转int的方法

    Linq中string转int的方法 在做批量删除时,需把一串id值所对应的数据删除,调试出现问题: Linq语句中如果使用ToString()进行类型转换,编译时不会报错,但执行时会出现如下错误: ...

最新文章

  1. mysql插入第一_mySQL教程 第5章 插入 更新与删除数据
  2. python读取excel送到网页_python+selenium excel中文读取填充到网页
  3. 开源上网行为管理_做好企业上网行为管理作用大
  4. php 压缩js css文件,PHP实现动态压缩js与css文件的方法
  5. Delphi vs VC++
  6. VMware vSphere Storage Appliance (VSA) 5.1 群集部署
  7. 区块链教程Fabric1.0源代码分析putils(protos/utils工具包)
  8. 数据挖掘入门到精通—R语言视频教程
  9. 【有图有真相】全国软考高级三连冠感悟
  10. Blender物理引擎
  11. 技术驱动婚恋,百合网的混合云、大数据与机器学习实践
  12. 企鹅吞狗,狗走狐悲,狼厂危矣
  13. day05 Servlet组件(上)
  14. assigning to rvalue解决解决
  15. 今日小游戏:消除棋子
  16. Kotlin学习笔记(1)-- 基础语法
  17. EXCEL怎么隔3行插入1空行?
  18. 将vector中的元素使用sort排序
  19. FXS,FXO,EM区别
  20. Win10:鼠标右键如何添加快捷关机、注销等功能

热门文章

  1. 系出名门Android(7) - 控件(View)之ZoomControls, Include, VideoView, WebView, RatingBar, Tab
  2. python oa系统_用python把C#操作OA的例子重写了一下
  3. bzoj 1024 [ SCOI 2009 ] 生日快乐 —— 递归
  4. 解决“无法从套接字读取更多数据”
  5. 求助:关于sql如何统计时间的问题
  6. 斜率优化(CDQ分治,Splay平衡树):BZOJ 1492: [NOI2007]货币兑换Cash
  7. 如何开发一个学生成绩管理糸统(9)
  8. wifi名称可以有空格吗_收购公司后可以变更公司名称吗,变更公司名称和股权如何处理?...
  9. 关于经纬度的两个计算[Teaksxgluxv]
  10. ZBLOG-ASP2.2如何给图片增加ALT标签说明文字?