前言

接口获取参数后,创建返回值模型的条件表达式作为参数,传入使用依赖注入实例化后的业务层。

业务层创建返回值模型的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动态表达式树查询的更多相关文章

  1. 利用 DynamicLinq 实现简单的动态表达式构建查询

    平时使用 LINQ 进行一些简单的条件拼接查询一般都会这样操作: public class SearchInputDto { public string ConditionA { get; set; ...

  2. 超简单的集成表达式树查询组件,Sy.ExpressionBuilder 使用说明

    Sy.ExpressionBuilder是一套依赖于表达式树上的集成的查询组件.设计的初衷没别的,就为了少写代码,让查询业务可以变得更加模式化.目前可以从nuget 获取到该组件. 来到查询,查询实体 ...

  3. C# 表达式树学习笔记

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  4. 【C#表达式树 一】Expressions 命名空间 38个类 2个接口 3个枚举

    注解 抽象类 Expression 提供用于为表达式树建模的类层次结构的根. 此命名空间中派生自的类 Expression (例如 MemberExpression 和 ParameterExpres ...

  5. EntityFramework动态多条件查询与Lambda表达式树

              在常规的信息系统中, 我们有需要动态多条件查询的情况, 例如UI上有多个选择项可供用户选择多条件查询数据. 那么在.net平台Entity Framework下, 我们用Lambd ...

  6. EF4.0、4.3创建表达式树状动态查询总结

    ---------------------------------------------快速适用 效果: where name like '%王%' and Age>=35 or Age< ...

  7. 表达式树在LINQ动态查询

    动态构建表达式树,最佳实践版,很实用! public class FilterCollection : Collection<IList<Filter>> { public F ...

  8. c#——表达式树在LINQ动态查询

    一般如果逻辑比较简单,只是存在有的情况多一个查询条件,有的情况不需要添加该查询条件 简单方式这样操作就可以了 public IQueryable<FileImport> DynamicCh ...

  9. Asp.net Core C#进行筛选、过滤、使用PredicateBuilder进行动态拼接lamdba表达式树并用作条件精准查询,模糊查询

    在asp.net core.asp.net 中做where条件过滤筛选的时候写的长而繁琐不利于维护,用PredicateBuilder进行筛选.过滤.LInq配合Ef.core进行动态拼接lamdba ...

随机推荐

  1. Hibernate实现对数据的CRUD

    今天主要去看公司的老框架, CRUD用的较多,所以总结一下步骤,以免忘记的时候温习 回顾 JDBC 工作过程: 加载驱动 建立连接 定义sql,发生sql语句 执行sql语句获得执行结果 处理返回结果 ...

  2. LightningChart解决方案:XY和3D图表(Polymer Char GPC-IR&#174;-工程案例)

    LightningChart解决方案:XY和3D图表(Polymer Char GPC-IR-工程案例) 所在行业:石化公司成立时间:1992年LightningChart解决方案:XY和3D图表 P ...

  3. NGINX镜像的制作

    NGINX镜像的制作 # mkdir -pv /opt/nginx # cd /opt/nginx/ # cat index.html www.dexter.com   编写Dockerfile # ...

  4. 推荐一款最强Python自动化神器!再也不用写代码了!

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理 搞过自动化测试的小伙伴,相信都知道,在Web自动化测试中,有一款自动化测试神器工具: seleniu ...

  5. 带你学习Python-基础知识的框架梳理

    对于编程初学者来说,在刚刚开始学习Python语言的时候,需要学习的内容有不少,比如计算机原理.网络.Web前端.后端.架构. 数据库都是必须掌握的知识点.因此初学者常常会陷入"只见树木,不 ...

  6. HCIP -- OSPF 总结

    OSPF:Open Shortest path First  :开方式最短路径优先 一.基础知识: 1.使用范围:IGP 2.协议算法特点:链路状态型路由协议,SPF算法 3.协议是否传递网络掩码:是 ...

  7. Linux下通用二进制方式安装MySQL

    1.下载glibc版本的MySQL: https://downloads.mysql.com/archives/community/ 2.查看mysql用户和mysql组是否存在(用户和组的信息存在/ ...

  8. (四)、vim的缓冲区、标签、窗口操作

    1.缓冲区的基本操作 a.文件与缓冲区的区别 vim file1   打开一个文件时,其实是从磁盘中读取文件到内存中,文件的内容会被加载到缓冲区中, 这个缓冲区在一个窗口上显示,所以他是一个已激活的缓 ...

  9. 在C#中使用OpenCV(使用GOCW)

    在C#中使用OpenCV(使用GOCW) 1.什么是GOCW       为了解决在Csharp下编写OpenCV程序的问题,我做过比较深入的研究,并且实现了高效可用的方法GreenOpenCshar ...

  10. SQL语句中case,when,then的用法

    用法如下bai: 复制代码 SELECT s.s_id, s.s_name, s.s_sex, CASE WHENs.s_sex='1'THEN'男' WHENs.s_sex='2'THEN'女' E ...