# PredictionBuilder **Repository Path**: tengfei8771/prediction-builder ## Basic Information - **Project Name**: PredictionBuilder - **Description**: 解析实体类,生成表达式用于EFCore或sqlsugar - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2023-03-30 - **Last Updated**: 2025-10-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PredictionBuilder #### 介绍 解析实体类,生成表达式。可用于linq以及使用Expression的ORM。 #### 软件架构 软件架构说明 #### 安装教程 1. nuget 搜索 PredictionBuilder 并安装 #### 使用说明 1.定义QueryModel ``` //queryModel internal class TestClass { public string Id { get; set; } [Operator(OperatorType.Contains)]//内置运算类型特性,如果存在[CustomMethod]特性则不生效 [CustomMethod(typeof(TestExtension), "TestMethod", OperatorType.GreaterThanOrEqual,0)]//自定义方法特性,需要声明orm拓展方法所在的类和方法(必须为静态public),同时根据定义的方法的返回值与预期值生成对应的表达式 [Connect(ConnectType.And)]//条件连接符 [MappingTarget("base_courses.Name", "base_video.VideoTitle")]//对应Type映射的属性 [ParameterOrder(ParameterOrderType.Asc)]//参数顺序 生成的是a.Id==1还是1==a.Id public string Name1 { get; set; } [Operator(OperatorType.Equal)] [Connect(ConnectType.And)] [MappingTarget("base_courses.Infos", "base_authors.Name")] [ParameterOrder(ParameterOrderType.Desc)] public string TestName { get; set; } public int Status { get; set; } } ``` 2.创建查询实体 ``` using System; using System.Linq; using System.Text; using SqlSugar; namespace test.Model { /// ///讲师表 /// [SugarTable("base_authors")] public partial class base_authors { public base_authors(){ } /// /// Desc: /// Default: /// Nullable:False /// [SugarColumn(IsPrimaryKey=true,IsIdentity=true)] public int Id {get;set;} /// /// Desc:讲师姓名 /// Default: /// Nullable:True /// public string Name {get;set;} /// /// Desc:职称职位 /// Default: /// Nullable:True /// public string Position {get;set;} /// /// Desc:讲师简介 /// Default: /// Nullable:True /// public string Infos {get;set;} } } using System; using System.Linq; using System.Text; using SqlSugar; namespace test.Model { /// ///分类表 /// [SugarTable("base_catalogs")] public partial class base_catalogs { public base_catalogs(){ } /// /// Desc: /// Default: /// Nullable:False /// [SugarColumn(IsPrimaryKey=true,IsIdentity=true)] public int Id {get;set;} /// /// Desc:名称 /// Default: /// Nullable:True /// public string Name {get;set;} /// /// Desc:父级Id /// Default: /// Nullable:True /// public int? ParentId {get;set;} /// /// Desc:0正常 -1删除 /// Default:0 /// Nullable:True /// public int? Status {get;set;} } } using System; using System.Linq; using System.Text; using SqlSugar; namespace test.Model { /// ///课程和分类关联表 /// [SugarTable("base_course_r_catalog")] public partial class base_course_r_catalog { public base_course_r_catalog(){ } /// /// Desc: /// Default: /// Nullable:False /// [SugarColumn(IsPrimaryKey=true,IsIdentity=true)] public int Id {get;set;} /// /// Desc: /// Default: /// Nullable:True /// public int? CatalogId {get;set;} /// /// Desc: /// Default: /// Nullable:True /// public int? CourseId {get;set;} public int? Status {get;set;} } } using System; using System.Linq; using System.Text; using SqlSugar; namespace test.Model { /// ///课程表 /// [SugarTable("base_courses")] public partial class base_courses { public base_courses(){ } /// /// Desc: /// Default: /// Nullable:False /// [SugarColumn(IsPrimaryKey=true,IsIdentity=true)] public int Id {get;set;} /// /// Desc:课程名称 /// Default: /// Nullable:True /// public string Name {get;set;} /// /// Desc:课程简介 /// Default: /// Nullable:True /// public string Infos {get;set;} /// /// Desc:是否置顶 /// Default:b'0' /// Nullable:True /// public bool? IsTop {get;set;} /// /// Desc:状态 0正常 -1删除 /// Default:0 /// Nullable:True /// public int? Status {get;set;} } } using System; using System.Linq; using System.Text; using SqlSugar; namespace test.Model { /// ///视频和课程关联表 /// [SugarTable("base_video_r_course")] public partial class base_video_r_course { public base_video_r_course(){ } /// /// Desc: /// Default: /// Nullable:False /// [SugarColumn(IsPrimaryKey=true,IsIdentity=true)] public int Id {get;set;} /// /// Desc: /// Default: /// Nullable:True /// public int? VideoId {get;set;} /// /// Desc: /// Default: /// Nullable:True /// public int? CourseId {get;set;} /// /// Desc:0 正常 -1删除 /// Default:0 /// Nullable:True /// public int? Status {get;set;} } } using System; using System.Linq; using System.Text; using SqlSugar; namespace test.Model { /// ///视频表 /// [SugarTable("base_videos")] public partial class base_videos { public base_videos(){ } /// /// Desc: /// Default: /// Nullable:False /// [SugarColumn(IsPrimaryKey=true,IsIdentity=true)] public int Id {get;set;} /// /// Desc:正题名 /// Default: /// Nullable:True /// public string VideoTitle {get;set;} /// /// Desc:视频代码 /// Default: /// Nullable:True /// public string VideoCode {get;set;} /// /// Desc:视频排序 /// Default: /// Nullable:True /// public int? SortId {get;set;} /// /// Desc:来源于产品 /// Default: /// Nullable:True /// public string ProductFrom {get;set;} /// /// Desc:视频缩略图 /// Default: /// Nullable:True /// public string VideoImage {get;set;} /// /// Desc:文件大小(MB) /// Default: /// Nullable:True /// public double? FileSize {get;set;} /// /// Desc:时长(秒) /// Default: /// Nullable:True /// public double? Duration {get;set;} /// /// Desc:视频简介 /// Default: /// Nullable:True /// public string VideoInfo {get;set;} } } ``` 3.特性说明 ``` 此特性已经移除!此特性已经移除!此特性已经移除!将此特性拆分其他三个特性,目的是更好的支持生成自定义方法。 public ConditionAttribute(OperatorType operatorType= OperatorType.Equal,ConnectType connectType=ConnectType.And, params string[] mapList) { } /// /// 内置运算符特性 /// /// 运算符类型 /// 条件连接特性 /// /// 连接类型 public ConnectAttribute(ConnectType connectType= ConnectType.And) { ConnectType = connectType; } /// /// 映射到对应类型的属性特性 /// /// 映射名称(支持全称、简称以及属性名) public MappingTargetAttribute(params string[] values) { Values= values; } /// /// 自定义方法特性 /// /// 静态方法所在类 /// 静态类名 /// 操作符 /// 预期返回值 public CustomMethodAttribute(Type methodType, string methodName, OperatorType operatorType, object methodPredictValue) { MethodType = methodType; MethodName = methodName; OperatorType = operatorType; MethodPredictValue = methodPredictValue; } /// /// ctor 使用此特性声明如果queryModel的属性值等于哪些值,则不生成表达式 /// /// 作为哪种类型判断 /// 忽略值集合(如果集合中有一条满足条件就会跳过条件构造) public SkipBuildAttribute(Type targetType=null,params object[] values) { } /// /// 声明参数的表达式左右顺序,例如a.Id==1或者1==a.Id /// /// 排序枚举 默认正序 public ParameterOrderAttribute(ParameterOrderType parameterOrderType = ParameterOrderType.Asc) { } //支持的运算符如下: public enum OperatorType { /// /// 相等 /// Equal, /// /// 不相等 /// NotEqual, /// /// 小于 /// LessThan, /// /// 小于等于 /// LessThanOrEqual, /// /// 大于 /// GreaterThan, /// /// 大于等于 /// GreaterThanOrEqual, /// /// 包含 /// Contains, /// /// 不包含 /// NotContains, /// /// 已什么开始 /// StartsWith, /// /// 不已什么开始 /// NotStartsWith, /// /// 已什么结束 /// EndsWith, /// /// 不已什么结束 /// NotEndsWith } 其中从contains开始到NotEndsWith结束,要求属性必须为string类型,否则会抛出异常 //IPredictionBuilder 支持的api如下 SetParameterName(arg[])//设置自定义的参数名 默认a,b,c,d可以根据需求修改 SetAggregateCondition(arg[])//设置聚合条件,可以理解为这几个条件拼接的结果和其他的条件拼接 ToExpression()//生成表达式 ``` 2.简单应用 ``` SqlSugarClient sqlSugarClient = new SqlSugarClient(new ConnectionConfig() { ConnectionString= "Server=localhost;Database=sz_test;Uid=root;Pwd=root;charset=utf8;port=3306;SslMode = none;", DbType=DbType.MySql, IsAutoCloseConnection=true, AopEvents=new AopEvents() { OnLogExecuted = (sql, p) => { Console.WriteLine(sql); } } }); TestClass queryModel = new TestClass() { Name1 = "测试", TestName="testName", Status=0 }; PredictionCreator creator = new PredictionCreator(queryModel); var exp= creator .CreateBuilder(1,null)//此参数为设置全局忽略条件,若queryModel的任意属性的值等于1或者null,则会跳过此条件的生成 .ToExpression(); Expression> exp1 = t => t.CourseImage == "1" || t.Name == "test"; var query = sqlSugarClient.Queryable((a, b, c, d, e, f) => new JoinQueryInfos( JoinType.Inner,a.Id==b.CatalogId, JoinType.Inner,b.CourseId==c.Id, JoinType.Inner,c.Id==d.CourseId, JoinType.Inner,d.VideoId==e.Id, JoinType.Inner,e.AuthorId==f.Id ) ).Where(exp).ToList(); ``` ps:最多支持Expression>个参数的表达式生成,如果需要更多,请继承 AbstractBuilder类自行拓展