Skip to content

Commit c7210c5

Browse files
author
何泽平
committed
123
1 parent 99084b8 commit c7210c5

16 files changed

+324
-114
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
# User-specific files (MonoDevelop/Xamarin Studio)
1313
*.userprefs
14-
14+
/SummerBoot.Test/app.json
1515
# Build results
1616
[Dd]ebug/
1717
[Dd]ebugPublic/

ExpressionParser/Parser/DbQueryProvider.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77

88
namespace ExpressionParser.Parser
99
{
10-
public delegate TR ExecuteFunc<out TR>(DbQueryResult parameter);
11-
1210
public class DbQueryProvider<T> : IQueryProvider
1311
{
1412
public QueryFormatter queryFormatter;

ExpressionParser/Parser/DbQueryResult.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,9 @@ public class DbQueryResult
2121
/// Id 字段的反射属性信息
2222
/// </summary>
2323
public PropertyInfo IdKeyPropertyInfo { get; set; }
24+
/// <summary>
25+
/// id字段的名称,有些数据库大小写敏感
26+
/// </summary>
27+
public string IdName { get; set; }
2428
}
2529
}
Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
namespace ExpressionParser.Parser.Dialect
1+
using System.Collections.Generic;
2+
3+
namespace ExpressionParser.Parser.Dialect
24
{
35
public class OracleQueryFormatter : QueryFormatter
46
{
5-
public OracleQueryFormatter():base(":","`","`")
7+
public OracleQueryFormatter():base(":","\"","\"")
68
{
79

810
}
@@ -11,5 +13,17 @@ protected override string GetFunctionAlias(string functionName)
1113
{
1214
return base.GetFunctionAlias(functionName);
1315
}
16+
17+
public override DbQueryResult Insert<T>(T insertEntity)
18+
{
19+
var result= base.Insert(insertEntity);
20+
if (result.IdKeyPropertyInfo != null)
21+
{
22+
23+
result.Sql += $" RETURNING {BoxTableNameOrColumnName(result.IdName)} INTO {parameterPrefix}{result.IdName}";
24+
}
25+
26+
return result;
27+
}
1428
}
1529
}

ExpressionParser/Parser/IRepository.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using System.Linq;
1+
using System;
2+
using System.Linq;
3+
using System.Linq.Expressions;
24

35
namespace ExpressionParser.Parser
46
{

ExpressionParser/Parser/QueryFormatter.cs

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ public QueryFormatter(string parameterPrefix, string leftQuote, string rightQuot
2525
private int parameterIndex = 0;
2626
private int selectIndex = 0;
2727

28-
private string parameterPrefix;
29-
private string leftQuote;
30-
private string rightQuote;
28+
protected string parameterPrefix;
29+
protected string leftQuote;
30+
protected string rightQuote;
3131

3232
public PageQueryResult GetByPage(string sql)
3333
{
@@ -124,6 +124,9 @@ public void Format(Expression expression)
124124
if (expression is SelectExpression selectExpression)
125125
{
126126
var result = this.VisitSelect(selectExpression);
127+
}else if(expression is WhereExpression whereExpression)
128+
{
129+
var result = this.VisitWhere(whereExpression);
127130
}
128131
else
129132
{
@@ -133,6 +136,20 @@ public void Format(Expression expression)
133136

134137
}
135138

139+
public void FormatWhere(Expression expression)
140+
{
141+
_sb.Clear();
142+
if (expression is SelectExpression selectExpression)
143+
{
144+
var result = this.VisitWhere(selectExpression.Where);
145+
}
146+
else
147+
{
148+
throw new NotSupportedException(nameof(expression));
149+
}
150+
151+
152+
}
136153
public DbQueryResult GetDbQueryDetail()
137154
{
138155
return new DbQueryResult()
@@ -387,7 +404,7 @@ private void Clear()
387404
this.sqlParameters.Clear();
388405
}
389406

390-
public DbQueryResult Insert<T>(T insertEntity)
407+
public virtual DbQueryResult Insert<T>(T insertEntity)
391408
{
392409
Clear();
393410
var table = this.getTableExpression(typeof(T));
@@ -417,6 +434,7 @@ public DbQueryResult Insert<T>(T insertEntity)
417434
{
418435
result.LastInsertIdSql = GetLastInsertIdSql();
419436
result.IdKeyPropertyInfo = keyColumn.MemberInfo as PropertyInfo;
437+
result.IdName = keyColumn.ColumnName;
420438
}
421439

422440
return result;
@@ -474,14 +492,10 @@ public DbQueryResult Delete<T>(T deleteEntity)
474492
var table = this.getTableExpression(typeof(T));
475493
var tableName = BoxTableNameOrColumnName(table.Name);
476494

477-
478-
var columnNameList = new List<string>();
479-
480495
var middleList = new List<string>();
481496
foreach (var column in table.Columns)
482497
{
483498
var columnName = BoxTableNameOrColumnName(column.ColumnName);
484-
columnNameList.Add(columnName);
485499
var parameterName = this.parameterPrefix + column.MemberInfo.Name;
486500
middleList.Add(columnName + "=" + parameterName);
487501
}
@@ -496,6 +510,32 @@ public DbQueryResult Delete<T>(T deleteEntity)
496510
return result;
497511
}
498512

513+
public DbQueryResult DeleteByExpression<T>(Expression exp)
514+
{
515+
Clear();
516+
var table = this.getTableExpression(typeof(T));
517+
var tableName = BoxTableNameOrColumnName(table.Name);
518+
519+
var middleResult= this.Visit(exp);
520+
this.FormatWhere(middleResult);
521+
var whereSql = _sb.ToString();
522+
523+
var deleteSql=$"delete from {tableName} where 1=1";
524+
if (!string.IsNullOrWhiteSpace(whereSql))
525+
{
526+
deleteSql += $" and {whereSql}";
527+
}
528+
529+
var result = new DbQueryResult()
530+
{
531+
Sql = deleteSql.Trim(),
532+
SqlParameters = this.sqlParameters
533+
};
534+
return result;
535+
}
536+
537+
538+
499539
public DbQueryResult GetAll<T>()
500540
{
501541
Clear();

ExpressionParser/Parser/Repository.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,15 @@ public DbQueryResult InternalDelete(T deleteEntity)
114114
return null;
115115
}
116116

117+
public DbQueryResult InternalDelete(Expression predicate)
118+
{
119+
if (Provider is DbQueryProvider<T> dbQueryProvider)
120+
{
121+
return dbQueryProvider.queryFormatter.DeleteByExpression<T>(predicate);
122+
}
123+
return null;
124+
}
125+
117126
public DbQueryResult InternalGet(dynamic id)
118127
{
119128
if (Provider is DbQueryProvider<T> dbQueryProvider)
@@ -131,6 +140,7 @@ public DbQueryResult InternalGetAll()
131140
}
132141
return null;
133142
}
143+
134144
}
135145

136146
}

SummerBoot.Test/Db.cs

Lines changed: 0 additions & 30 deletions
This file was deleted.

SummerBoot.Test/Db/OracleDb.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System;
2+
using Microsoft.EntityFrameworkCore;
3+
using SummerBoot.Test;
4+
using SummerBoot.WebApi;
5+
using SummerBoot.WebApi.Models;
6+
7+
namespace SummerBoot.WebApi
8+
{
9+
public class OracleDb : DbContext
10+
{
11+
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
12+
{
13+
var connectionString = MyConfiguration.GetConfiguration("oracleDbConnectionString");
14+
if (string.IsNullOrWhiteSpace(connectionString))
15+
{
16+
throw new ArgumentNullException("oracle connectionString must not be null");
17+
}
18+
optionsBuilder.UseOracle(connectionString);
19+
}
20+
21+
public DbSet<Customer> Customer { get; set; }
22+
public DbSet<OrderHeader> OrderHeader { get; set; }
23+
public DbSet<OrderDetail> OrderDetail { get; set; }
24+
}
25+
}

SummerBoot.Test/Db/SqliteDb.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System;
2+
using Microsoft.EntityFrameworkCore;
3+
using SummerBoot.Test;
4+
using SummerBoot.WebApi;
5+
using SummerBoot.WebApi.Models;
6+
7+
namespace SummerBoot.WebApi
8+
{
9+
public class SqliteDb:DbContext
10+
{
11+
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
12+
{
13+
var connectionString = MyConfiguration.GetConfiguration("sqliteDbConnectionString");
14+
if (string.IsNullOrWhiteSpace(connectionString))
15+
{
16+
throw new ArgumentNullException("sqlite connectionString must not be null");
17+
}
18+
optionsBuilder.UseSqlite(connectionString);
19+
}
20+
21+
public DbSet<Customer> Customer { get; set; }
22+
public DbSet<OrderHeader> OrderHeader { get; set; }
23+
public DbSet<OrderDetail> OrderDetail { get; set; }
24+
}
25+
}

SummerBoot.Test/MyConfiguration.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System.IO;
2+
using Microsoft.Extensions.Configuration;
3+
4+
namespace SummerBoot.Test
5+
{
6+
public class MyConfiguration
7+
{
8+
static readonly string CONFIG_FILE = "app.json"; // 配置文件地址
9+
10+
static IConfiguration Configs;
11+
12+
/// <summary>
13+
/// 获取配置文件的配置节点
14+
/// </summary>
15+
/// <param name="configKey">多个节点可以用英文.号隔开</param>
16+
/// <returns></returns>
17+
public static string GetConfiguration(string configKey)
18+
{
19+
if (Configs == null)
20+
{
21+
var build = new ConfigurationBuilder();
22+
build.SetBasePath(Directory.GetCurrentDirectory()); // 获取当前程序执行目录
23+
build.AddJsonFile(CONFIG_FILE, true, true);
24+
Configs = build.Build();
25+
}
26+
27+
if (configKey.Contains("."))
28+
{
29+
IConfigurationSection child = null;
30+
foreach (string key in configKey.Split('.'))
31+
{
32+
if (child == null)
33+
child = Configs.GetSection(key);
34+
else
35+
child = child.GetSection(key);
36+
}
37+
38+
return (child == null) ? "" : child.Value;
39+
}
40+
else
41+
{
42+
return Configs.GetSection(configKey).Value;
43+
}
44+
}
45+
}
46+
}

0 commit comments

Comments
 (0)