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