[EF]关于EF使用Contains关键字的问题

关于EF使用Contains关键字的问题

一. 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,速度很快。
在这里插入图片描述

以上转自:https://www.cnblogs.com/yaopengfei/p/13595270.html

问题来了,如果是int类型则呢?
德仔 亲子验证:如果遇到数据库字段是int类型,则需要.value.否则无法推断

 
  List<int> sn = state.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(Int32.Parse).ToList();
  equipmentProblems = equipmentProblems.Where(c => sn.Contains(c.State.Value));
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值