ORM动态表达式树查询
前言
接口获取参数后,创建返回值模型的条件表达式作为参数,传入使用依赖注入实例化后的业务层。
业务层创建返回值模型的IQUERY后,再使用参数条件表达式。最后进行延迟查询。
代码实现
参数模型DemoParaModel
public class DemoParaModel
{
/// <summary>
/// 必填参数
/// </summary>
[Required]
public string Age { get; set; }
public string Name { get; set; }
}
ORM实体Demo_Age
[Table("DEMO_AGE")]
public class Demo_Age
{
[Column("ID", IsPrimaryKey = true)]
public string ID { get; set; }
[Column("AGE")]
public string Age { get; set; }
}
ORM实体Demo_Name
[Table("DEMO_NAME")]
public class Demo_Name
{
[Column("ID", IsPrimaryKey = true)]
public string ID { get; set; }
[Column("Name")]
public string Name { get; set; }
}
返回值模型
public class View_DemoPerson
{
public string ID { get; set; }
public string Name { get; set; }
public string Age { get; set; }
}
控制器接口
构造表达式时的AND方法的实现:Linq.Expressions扩展
public class DemoController : BaseController
{
#region 服务
private IDemoService _demoService;
public DemoController(IDemoService demoService)
{
_demoService = demoService;
}
#endregion
public ActionResult Login(DemoParaModel paraModel)
{
//创建表达式
Expression<Func<View_DemoPerson, bool>> lambdaExpression = t => true;
//构造表达式
if (!string.IsNullOrWhiteSpace(paraModel.Age))
{
lambdaExpression = lambdaExpression.And(t => t.Age == paraModel.Age);
}
if (!string.IsNullOrWhiteSpace(paraModel.Name))
{
lambdaExpression = lambdaExpression.And(t => t.Name == paraModel.Name);
}
//获取视图模型数据
List<View_DemoPerson> list = _demoService.DemoDoSomeThing(lambdaExpression);
//返回数据
return JsonResult(list);
}
}
业务层接口
public interface IDemoService
{
List<View_DemoPerson> DemoDoSomeThing(Expression<Func<View_DemoPerson, bool>> lambda = null);
}
业务层接口实例
public class DemoService : ServiceBase, IDemoService
{
public List<View_DemoPerson> DemoDoSomeThing(Expression<Func<View_DemoPerson, bool>> lambda = null)
{
List<View_DemoPerson> list = new List<View_DemoPerson>();
using (DbContext)
{
//先获取业务所有涉及表的数据库实体的IQuery
IQuery<Demo_Name> query_DemoName = DbContext.Query<Demo_Name>();
IQuery<Demo_Age> query_DemoAge = DbContext.Query<Demo_Age>();
//将数据库实体的IQuery关联查询,创建出返回模型的IQuery
IQuery<View_DemoPerson> query_View_DemoPerson =
query_DemoName.LeftJoin(query_DemoAge, (x, y) => x.ID == y.ID)
.Select(
(x, y) => new View_DemoPerson
{
ID = x.ID,
Name = x.Name,
Age = y.Age
});
//对返回模型的IQuery使用传进来的条件表达式参数
query_View_DemoPerson = query_View_DemoPerson.Where(lambda);
//延迟查询
list = query_View_DemoPerson.ToList();
}
return list;
}
}
ORM动态表达式树查询的更多相关文章
- 利用 DynamicLinq 实现简单的动态表达式构建查询
平时使用 LINQ 进行一些简单的条件拼接查询一般都会这样操作: public class SearchInputDto { public string ConditionA { get; set; ...
- 超简单的集成表达式树查询组件,Sy.ExpressionBuilder 使用说明
Sy.ExpressionBuilder是一套依赖于表达式树上的集成的查询组件.设计的初衷没别的,就为了少写代码,让查询业务可以变得更加模式化.目前可以从nuget 获取到该组件. 来到查询,查询实体 ...
- C# 表达式树学习笔记
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 【C#表达式树 一】Expressions 命名空间 38个类 2个接口 3个枚举
注解 抽象类 Expression 提供用于为表达式树建模的类层次结构的根. 此命名空间中派生自的类 Expression (例如 MemberExpression 和 ParameterExpres ...
- EntityFramework动态多条件查询与Lambda表达式树
在常规的信息系统中, 我们有需要动态多条件查询的情况, 例如UI上有多个选择项可供用户选择多条件查询数据. 那么在.net平台Entity Framework下, 我们用Lambd ...
- EF4.0、4.3创建表达式树状动态查询总结
---------------------------------------------快速适用 效果: where name like '%王%' and Age>=35 or Age< ...
- 表达式树在LINQ动态查询
动态构建表达式树,最佳实践版,很实用! public class FilterCollection : Collection<IList<Filter>> { public F ...
- c#——表达式树在LINQ动态查询
一般如果逻辑比较简单,只是存在有的情况多一个查询条件,有的情况不需要添加该查询条件 简单方式这样操作就可以了 public IQueryable<FileImport> DynamicCh ...
- Asp.net Core C#进行筛选、过滤、使用PredicateBuilder进行动态拼接lamdba表达式树并用作条件精准查询,模糊查询
在asp.net core.asp.net 中做where条件过滤筛选的时候写的长而繁琐不利于维护,用PredicateBuilder进行筛选.过滤.LInq配合Ef.core进行动态拼接lamdba ...
随机推荐
- SQL注入fuzz字典
length Length + handler likeLiKe selectSeleCT sleepSLEEp databaseDATABASe delete having oroR asAs -~ ...
- 彻底理解Hive中的锁
前面遇到过一次因为Hive中表被锁住了,导致定时任务一直失败.这两天又出现了表被锁,原因是连接hiveserver2过于频繁,mysql连接被打满,引发的连锁反应,导致我们的小时任务一直失败,下午重点 ...
- 【命令】man命令帮助文档详解
前言:Linux命令分为内建命令和外部命令:内建命令是shell本身自带的,外部命令是是一个可执行程序 我们在使用命令帮助的时候需要钱哦区分命令是内建命令还是外部命令 一.查看一个命令是内建命令还是外 ...
- 检验实时3D像素流送平台好坏的七个标准!(上)
将交互式3D像素流送技术作为有价值的企业工具之后,就该寻找像素流送服务供应商了.问题在于交互式3D像素流送是一种新兴技术,因此很难知道要问供应商的正确问题.在开始使用之前,这里有7个问题,您应该从候选 ...
- 任务调度框架Quartz快速入门!
目录 Quartz是什么 Quartz中的重要API及概念 超重要API 重要概念 Quartz设计理念:为什么设计Job和Trigger? 最简单的Quartz使用案例 Job实例和JobDetai ...
- 什么是ZooKeeper?ZooKeeper分布式事务详解
前言 上一章我们了解了zookeeper到底是什么,这一章重点来看zookeeper当初到底面临什么问题? 而zookeeper又是如何解决这些问题的? 实际上zookeeper主要就是解决分布式环境 ...
- JavaScript window.onload 事件和 jQuery ready 函数有何不同?
JavaScript window.onload 事件和 jQuery ready 函数之间的主要区别是,前者除了要等待 DOM 被创建还要等到包括大型图片.音频.视频在内的所有外部资源都完全加载.如 ...
- hashmap有一个loadFactory为什么是0.75从泊松分布解析看看
简述: 写这篇文章是看到网上的一篇面试题,有面试官问hashmap有一个loadFactory为什么是0.75 我先解释一下 0.75上下文,当一个hashmap初始数组大小暂时不考虑扩容情况,初始 ...
- mysql事务-简介
mysql事务 问题 概要 storage engine必须支持事务 事务根据隔离级别的不同,不同事务之间有不同的可见性 begin 或者 start transaction, 显式开启事务:comm ...
- TCP三次握手(通俗易懂)
一--导读 前不久中国和外国RPEC协议的签订,标志着东亚自贸区的建立成功.现在韩国和日本要做贸易.日本一直监听着韩国总统的一举一动,但他又不会主动.(服务器的监听状态)只是被动的等着韩国总统先开口. ...