-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Expand file tree
/
Copy pathDynamicLambdaTest.cs
More file actions
158 lines (134 loc) · 6.58 KB
/
Copy pathDynamicLambdaTest.cs
File metadata and controls
158 lines (134 loc) · 6.58 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
using System;
using System.Threading.Tasks;
using Autofac;
using Blog.Core.Common.Helper;
using Blog.Core.IRepository.Base;
using Blog.Core.Model.Models;
using SqlSugar;
using Xunit;
using Xunit.Abstractions;
namespace Blog.Core.Tests.Common_Test;
public class DynamicLambdaTest
{
private readonly ITestOutputHelper _testOutputHelper;
private readonly IBaseRepository<BlogArticle> _baseRepository;
DI_Test dI_Test = new DI_Test();
public DynamicLambdaTest(ITestOutputHelper testOutputHelper)
{
_testOutputHelper = testOutputHelper;
var container = dI_Test.DICollections();
_baseRepository = container.Resolve<IBaseRepository<BlogArticle>>();
_baseRepository.Db.Aop.OnLogExecuting = (sql, p) =>
{
_testOutputHelper.WriteLine(UtilMethods.GetNativeSql(sql, p));
};
Init();
}
private void Init()
{
_baseRepository.Db.CodeFirst.InitTables<BlogArticle>();
_baseRepository.Db.CodeFirst.InitTables<BlogArticleComment>();
_baseRepository.Db.CodeFirst.InitTables<SysUserInfo>();
}
/// <summary>
/// 普通查询 例子<br/>
/// 没有复杂链表 主要使用导航属性<br/>
/// 推荐将条件拼接交给前端 后端只定义个接口就很方便 维护也很简单<br/>
/// </summary>
[Fact]
public async void Get_Blogs_DynamicTest()
{
//方便前端自定义条件查询
//语法更舒服
var data = await _baseRepository.Query();
_testOutputHelper.WriteLine(data.ToJson());
await TestConditions("");
await TestConditions("bId=1");
await TestConditions("bId=2");
await TestConditions("bId in (1,2,3,4,5)");
await TestConditions("bId in (1,2,3,4,5)|| bUpdateTime>=\"2019-01-01 01:01:01\"");
await TestConditions("btitle like \" 测试数据\"");
await TestConditions("btitle like \"测试数据\" && bId>0");
await TestConditions("btitle like \"测试!@#$%^&*()_+|}{\":<>?LP\"数据\" && bId>0");
await TestConditions(
"btitle like \"测试!@+)(*()_&%^&^$^%$IUYWIQOJVLXKZM>?Z<>?<L:\"SQLitePCL{|\"CM<:\"KJLEGRTOWEJT\"#$%^&*()_+|}{\":<>?LP\"数据\" && bId>0");
await TestConditions("IsDeleted == false");
await TestConditions("IsDeleted == true");
await TestConditions("IsDeleted == true && ( btitle like \"张三\" || btitle like \"李四\" )");
await TestConditions(
"IsDeleted == true && ( btitle like \"张三\" || btitle like \"李四\" || ( btitle StartsLike \"王五\" && btitle EndLike \"赵六\" ) )");
//导航属性
//一对一
//查询 老张的文章
await TestConditions("User.RealName like \"老张\"");
//查询 2019年后的老张文章
await TestConditions("User.RealName like \"老张\" && bUpdateTime>=\"2019-01-01 01:01:01\"");
//一对多
//查询 评论中有"写的不错"的文章
await TestConditions("Comments.Comment like \"写的不错\"");
//查询 2019后的 评论中有"写的不错"的文章
await TestConditions("Comments.Comment like \"写的不错\" && bUpdateTime>=\"2019-01-01 01:01:01\"");
//查询 有老张评论的文章
await TestConditions("Comments.User.LoginName like \"老张\"");
}
/// <summary>
/// 复杂链表 也能使用动态条件<br/>
/// 存在复杂的链表 left join等
/// </summary>
[Fact]
public async void Get_Blogs_DynamicJoinTest()
{
//方便前端自定义条件查询
//语法更舒服
var data = await _baseRepository.Query();
_testOutputHelper.WriteLine(data.ToJson());
await TestJoinConditions("");
await TestJoinConditions("bId=1");
await TestJoinConditions("bId=2");
await TestJoinConditions("bId in (1,2,3,4,5)");
await TestJoinConditions("bId in (1,2,3,4,5)|| bUpdateTime>=\"2019-01-01 01:01:01\"");
await TestJoinConditions("btitle like \" 测试数据\"");
await TestJoinConditions("btitle like \"测试数据\" && bId>0");
await TestJoinConditions("btitle like \"测试!@#$%^&*()_+|}{\":<>?LP\"数据\" && bId>0");
await TestJoinConditions(
"btitle like \"测试!@+)(*()_&%^&^$^%$IUYWIQOJVLXKZM>?Z<>?<L:\"SQLitePCL{|\"CM<:\"KJLEGRTOWEJT\"#$%^&*()_+|}{\":<>?LP\"数据\" && bId>0");
await TestJoinConditions("IsDeleted == false");
await TestJoinConditions("IsDeleted == true");
await TestJoinConditions("IsDeleted == true && ( btitle like \"张三\" || btitle like \"李四\" )");
await TestJoinConditions(
"IsDeleted == true && ( btitle like \"张三\" || btitle like \"李四\" || ( btitle StartsLike \"王五\" && btitle EndLike \"赵六\" ) )");
//导航属性
//一对一
//查询 老张的文章
await TestJoinConditions("User.RealName like \"老张\"");
//查询 2019年后的老张文章
await TestJoinConditions("User.RealName like \"老张\" && bUpdateTime>=\"2019-01-01 01:01:01\"");
//一对多
//查询 评论中有"写的不错"的文章
await TestJoinConditions("Comments.Comment like \"写的不错\"");
//查询 2019后的 评论中有"写的不错"的文章
await TestJoinConditions("Comments.Comment like \"写的不错\" && bUpdateTime>=\"2019-01-01 01:01:01\"");
//查询 有老张评论的文章
await TestJoinConditions("Comments.User.LoginName like \"老张\"");
}
private async Task TestConditions(string conditions)
{
var express = DynamicLinqFactory.CreateLambda<BlogArticle>(conditions);
_testOutputHelper.WriteLine(new string('=', 100));
var product = await _baseRepository.Query(express);
_testOutputHelper.WriteLine($"条件:{DynamicLinqFactory.FormatString(conditions)}\r\nLambda:{express}\r\n结果:{product.Count}");
_testOutputHelper.WriteLine(new string('=', 100));
}
private async Task TestJoinConditions(string conditions)
{
var express = DynamicLinqFactory.CreateLambda<BlogArticle>(conditions);
_testOutputHelper.WriteLine(new string('=', 100));
var product = await _baseRepository.Db.Queryable<BlogArticle>()
.LeftJoin<SysUserInfo>((b, u) => Convert.ToInt64(b.bsubmitter) == u.Id)
.MergeTable()
.Where(express)
.ToListAsync();
_testOutputHelper.WriteLine($"条件:{DynamicLinqFactory.FormatString(conditions)}\r\nLambda:{express}\r\n结果:{product.Count}");
_testOutputHelper.WriteLine(new string('=', 100));
}
}