# 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类自行拓展