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;

        }

    }
posted @ 2021-01-19 09:21  sorachannel  阅读(212)  评论(0)    收藏  举报