关于EF使用Contains关键字的问题
一. EFCore剖析
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();
写法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,y4”;
错误做法:直接用字符串contains用户的userName!!!
string str = "p1,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,y4";
var strList = str.Split(',').ToList();
var data5 = dbContext.T_UserInfor.Where(u => strList.Contains(u.userName)).ToList();
二. EF剖析
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,y4”;
错误做法:直接用字符串contains用户的userName!!!
string str = "p1,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,').ToList();
var data5 = dbContext.T_UserInfor.Where(u => strList.Contains(u.userName)).ToList();
以上转自: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));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。