• 第十八节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
     
  • 相关阅读:
    管理技巧,绩效考核自评怎么写
    网站运营文章LIST
    搜索引擎算法研究专题六:HITS算法
    搜索引擎算法研究专题五:TF-IDF详解
    搜索引擎算法研究专题七:Hilltop算法
    搜索引擎算法研究专题四:随机冲浪模型介绍
    搜索引擎算法研究专题三:聚集索引与非聚集索引介绍
    利用Lucene.net搜索引擎进行多条件搜索的做法
    五大主流数字币钱包:imToken数字货币钱包,Bitcoin core钱包,BTS网页版钱包,AToken轻钱包,Blockchain
    Java 9 逆天的十大新特性
  • 原文地址:https://www.cnblogs.com/yaopengfei/p/13595270.html
Copyright © 2020-2023  润新知