第十八節: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 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM