【Where语法全解密】.NET开源ORM框架 SqlSugar 系列

文章目录


前言

说到 SQL 语句,最常见的也是最重要的两个关键词 莫过于 WhereSelect 两兄弟了。Where关键词主要用作条件筛选,使用频率那是大的不得了,那我们今天给它开个专场,看看ORM 框架里 Where 都有哪些语法。

一、普通表达式查询 Where

小贴士: 表达式: && 表示 AND|| 表式 OR

csharp 复制代码
//id=@id
var list=db.Queryable<Student>().Where(it => it.Id == id).ToList();
 
//多个条件
var list2=db.Queryable<Student>()
.WhereIF(id>0,it => it.Id == id)// 如果id>0 添加条件 id=@id  
.WhereIF(name!=null,it => it.name== "a") //如果 name !=null 添加条件 name='a'
.ToList();
 
//id=@id or name like '%'+@name+'%'
var list2 = db.Queryable<Student>().Where(it => it.Id == id||it.Name.Contains("jack")).ToList();

二、根据SQL查询 where

csharp 复制代码
//id=@id
var list=db.Queryable<Student>().Where("id=@id",new { id=1}).ToList();
//id=@id or name like '%'+@name+'%'
var list2 = db.Queryable<Student>().Where("id=@id or name like '%'+@name+'%' ",new { id=1,name="jack"}).ToList();

三、动态查询

csharp 复制代码
var json = [
   {"FieldName":"id","ConditionalType":"0","FieldValue":"1"},
   {"FieldName":"name","ConditionalType":"0","FieldValue":"jack"}
 ]
  
//5.0.5.1 Json直接序列化
var conModels= db.Context.Utilities.JsonToConditionalModels(json)  
var student = db.Queryable<Student>().Where(conModels).ToList(); // id=1 and name=jack
   
   
//手动构造 
 var cs= new List<IConditionalModel>();
 cs.Add(new ConditionalModel{FieldName="id",ConditionalType=ConditionalType.Equal,FieldValue="1"});
 cs.Add(new ConditionalModel{FieldName="name",ConditionalType=ConditionalType.Equal,FieldValue="jack"})

四、动态拼表达式查询 ,拼拉姆达

csharp 复制代码
//创建表达式
var exp= Expressionable.Create<Student>()
                .And(it=>it.Id==1)
                .Or(it =>it.Name.Contains("jack"))
                .ToExpression();//注意 这一句 不能少
//使用表达式                
var list=db.Queryable<Student>().Where(exp).ToList();
 
 
//多表查询
var exp=Expressionable.Create<T1,T2>()

五、条件拼接查询

🎯**特别注意:**当 query 用于2个地方的时候一定要加 Clone 这点和 EF 有本质区。

csharp 复制代码
var query = db.Queryable<Student>().Where(it=>it.Id==1);
 
 if(条件)
  query.Where(it => it.Name == "jack");
 if(条件)
   query.Where(it => it.Id==1);
    
 int count=query.Clone().Count();//当query用于2个地方的时候一定要加Clone这点和EF有本质区别
 var list=query.Clone.ToList();

六、链式条件查询

csharp 复制代码
var query = db.Queryable<Student>()
                .WhereIF(!string.IsNullOrEmpty(name), it => it.Name.Contains(name))
                .WhereIF(id>0, it => it.Id==id).ToList();

七、根据Class查询,根据实查询

🎯特别注意ignoreDefaultValue=true 那么实体中的 ID=0 就不是条件,ID=1就会当作条件。

csharp 复制代码
var getAll = db.Queryable<Order>().WhereClass(new Order() { Name="a"},ignoreDefaultValue:true).ToList();//单个实体
 
var getAll = db.Queryable<Order>().WhereClass(List<Order>,ignoreDefaultValue:true).ToList();//支持集合
 
//ignoreDefaultValue=true 那么实体中的ID=0就不是条件,ID=1就会当作条件
//根据实体类查询

八、根据Class中主键查询

csharp 复制代码
 var getAll = db.Queryable<Order>().WhereClassByPrimaryKey(new Order() { Id=1 }).ToList(); //单个实体
  
 var getAll = db.Queryable<Order>().WhereClassByPrimaryKey(List<Order>).ToList(); //支持集合
  
 //根据实体类中的主键查询

九、根据字典查询

适合多字段批量过滤

csharp 复制代码
var getAll=db.Queryable<Order>().WhereColumns(new List<Dictionary<string, object>>).ToList()

十、查询函数

Where 中使用 SqlFunc 函数

csharp 复制代码
var list=db.Queryable<Order>().Where(it=>SqlFunc.DateIsSame(it.Time,DateTime.Now)).ToList()

十一、Where中有子查询

csharp 复制代码
var list= db.Queryable<Student>()
.Where(st=> SqlFunc.Subqueryable<School>().Where(sch=>sch.Id==st.SchoolId).Any()).ToList();
//更多用法看菜单:子查询

十二、Where中用SQL

csharp 复制代码
var list=db.Queryable<Student>().Where("id=@id",new {id=1}).ToList()

十三、字符串表达式

注意5.1.4.107-preview14+ 版本支持该语法。

csharp 复制代码
 //程序启动时配置
  StaticConfig.DynamicExpressionParserType = typeof(DynamicExpressionParser);
  StaticConfig.DynamicExpressionParsingConfig = new ParsingConfig()//用到SqlFunc需要配置这个属性
           {
              CustomTypeProvider = new SqlSugarTypeProvider()//这个类需要自已写在下面有
           };
         
             
 //导航属性动态
 var list3 = db.Queryable<UnitPerson011>().Where("it", $"SqlFunc.Exists(it.Address.Id)").ToList(); 
  
 //普通条件动态
 var list4 = db.Queryable<UnitPerson011>().Where("it", $"it.Name=={"a"}").ToList(); 
  
 //动态类+动态条件
 var list5=db.QueryableByObject(typeof(UnitPerson011)).Where("it", $"it.Address.Id=={1}").ToList(); 
  
  
//扩展类型          
public class SqlSugarTypeProvider : DefaultDynamicLinqCustomTypeProvider
        {
            public override HashSet<Type> GetCustomTypes()
            {
                var customTypes = base.GetCustomTypes();
                customTypes.Add(typeof(SqlFunc));//识别SqlFunc
                return customTypes;
            }
 }
         
 
/****参数说明****/
 
//硬编码  Id>1
FormattableString str = $"it.Id>1";
  
//固定字段+参数化变量 Id>@p=1
FormattableString str2 = FormattableStringFactory.Create("it.Id>{0}",1);
  
//动态字段+参数化变量 Id>@p=1
var p="it.Id";
FormattableString str2 = FormattableStringFactory.Create(p+">{0}",1);

总结

看吧,一个最普通的 Where 关键词竟然有那么多用法,你学废了吗? 好了,今天就到这吧,给我点点赞,拉拉关注。


🎀💎🎀 .NET开源 ORM 框架 SqlSugar 系列 🎀💎🎀

【开篇】.NET开源 ORM 框架 SqlSugar 系列
【入门必看】.NET开源 ORM 框架 SqlSugar 系列
【实体配置】.NET开源 ORM 框架 SqlSugar 系列
【Db First】.NET开源 ORM 框架 SqlSugar 系列
【Code First】.NET开源 ORM 框架 SqlSugar 系列
【数据事务】.NET开源 ORM 框架 SqlSugar 系列
【连接池】.NET开源 ORM 框架 SqlSugar 系列
【查询目录】.NET开源 ORM 框架 SqlSugar 系列
【查询基础】.NET开源 ORM 框架 SqlSugar 系列
【排序用法】.NET开源 ORM 框架 SqlSugar 系列
【分组去重】.NET开源 ORM 框架 SqlSugar 系列
【联表查询】.NET开源 ORM 框架 SqlSugar 系列
【导航查询】.NET开源 ORM 框架 SqlSugar 系列
【子查询】.NET开源 ORM 框架 SqlSugar 系列
【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列
【配置查询】.NET开源 ORM 框架 SqlSugar 系列
【并集查询】.NET开源 ORM 框架 SqlSugar 系列
【树型查询】.NET开源 ORM 框架 SqlSugar 系列
【表格查询】.NET开源 ORM 框架 SqlSugar 系列
【动态表达式】.NET开源 ORM 框架 SqlSugar 系列
【查询函数】.NET开源ORM框架 SqlSugar 系列
【过滤器】.NET开源 ORM 框架 SqlSugar 系列
【跨库查询、多库查询】.NET开源 ORM 框架
​【报表查询】.NET开源ORM框架 SqlSugar 系列

相关推荐
ChaITSimpleLove13 分钟前
.NET 10 的 AI 技术栈全景:M.E.AI、MCP 与 Agent Framework 深度解析
人工智能·.net·ai agent·mcp·agent framework·m.e.ai·hosted agents
Highcharts.js28 分钟前
Highcharts 下钻(Drilldown)柱状图 Demo
数据库·信息可视化·hbase·highcharts·drilldown·js模块·下钻图表
翼龙云_cloud42 分钟前
阿里云国际渠道代理商:如何在ECS上部署Flask应用?
运维·数据库·阿里云·flask·云计算
进阶的小木桩1 小时前
mysql 安装问题解决方案记录
数据库·mysql
2601_962071572 小时前
如何利用SpringSecurity进行认证与授权
java·服务器·数据库
山峰哥2 小时前
数据库工程与查询优化案例深度复盘‌
数据库·sql·oracle·编辑器·深度优先·宽度优先
IT大白鼠2 小时前
MSF数据库与资产管理——专业渗透测试流程
数据库·安全·msf
IvorySQL2 小时前
PostgreSQL 日报|内核多项缺陷修复与数据校验补丁推进(8 月 27 日)
数据库·postgresql·区块链
风吹心凉2 小时前
Agent大脑-RAG知识库
数据库
VALENIAN瓦伦尼安教学设备2 小时前
设备状态检测振动分析实训台案例分析
大数据·数据库·人工智能·嵌入式硬件·算法