第十八节:EF和EFCore中Contains和Like各种用法剖析

一. EFCore剖析

1. 过滤查询

eg:查询用户姓名中含有p字母的所有用户信息。

写法1:使用EF.Functions.Like

var data1 = dbContext.T_UserInfor.Where(u => EF.Functions.Like(u.userName, "%p%")).ToList();
var data2 = (from p in dbContext.T_UserInfor
              where EF.Functions.Like(p.userName, "%p%")
              select p).ToList();

生成的sql语句:Like

写法2:使用Contains

 var data3 = dbContext.T_UserInfor.Where(u => u.userName.Contains("p")).ToList();

生成的sql语句:CHARINDEX("p",userName)>0

此处复习一下 CHARINDEX(str1,str2),函数返回子字符串str1在字符串str2中的开始位置

2. 包含关系

eg:求用户姓名为 "p1,p2,p3,p4,x2,y4"的所有用户信息,已知字符串 string str = "p1,p2,p3,p4,x2,y4";

错误做法:直接用字符串contains用户的userName!!!

 string str = "p1,p2,p3,p4,x2,y4";
 var data4 = dbContext.T_UserInfor.Where(u => str.Contains(u.userName)).ToList();

生成的sql:userName='' or CHARINDEX(userName,str)>0 

这种写法是不友好的,不但查询慢,而且还有一个空字符串的情况,而且当userName=p  或者=x 的时候,也会被搜索出来,这个是不对,所以不要用!

正确做法:将字符串转换成List,然后再用contains。

 string str = "p1,p2,p3,p4,x2,y4";
 var strList = str.Split(',').ToList();
 var data5 = dbContext.T_UserInfor.Where(u => strList.Contains(u.userName)).ToList();

生成的SQL:in,速度很快。

 

二. EF剖析

1. 过滤查询

eg:查询用户姓名中含有p字母的所有用户信息。

写法1:使用SQLMethods.Like(在EF6.x中已经不能使用了,直接报错了!!)

var data1 = dbContext.T_UserInfor.Where(u => SqlMethods.Like(u.userName, "%p%")).ToList();
var data2 = (from p in dbContext.T_UserInfor
             where SqlMethods.Like(p.userName, "%p%")
             select p).ToList();

写法2:使用Contains

 var data3 = dbContext.T_UserInfor.Where(u => u.userName.Contains("p")).ToList();

生成的sql语句:是Like,  此处和EFCore不一样,EFCore生成的是CHARINDEX("p",userName)>0

2. 包含关系

eg:求用户姓名为 "p1,p2,p3,p4,x2,y4"的所有用户信息,已知字符串 string str = "p1,p2,p3,p4,x2,y4";

错误做法:直接用字符串contains用户的userName!!!

 string str = "p1,p2,p3,p4,x2,y4";
 var data4 = dbContext.T_UserInfor.Where(u => str.Contains(u.userName)).ToList();

生成的sql: WHERE ( CAST(CHARINDEX([Extent1].[userName], @p__linq__0) AS int)) > 0  和EFCore有点区别

这种写法是不友好的,不但查询慢,而且当userName=p  或者=x 的时候,也会被搜索出来,这个是不对,所以不要用!

正确做法:将字符串转换成List,然后再用contains。

 string str = "p1,p2,p3,p4,x2,y4";
 var strList = str.Split(',').ToList();
 var data5 = dbContext.T_UserInfor.Where(u => strList.Contains(u.userName)).ToList();

生成的SQL:in,速度很快。

 

 

 

 

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @   Yaopengfei  阅读(6421)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示