Skip to content

Commit bf14e03

Browse files
authored
Merge pull request #18 from f-shake/dev
SQL构建器、MAUI查询
2 parents bb15430 + bd129e3 commit bf14e03

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+1695
-298
lines changed

Directory.Packages.props

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,41 @@
44
</PropertyGroup>
55
<ItemGroup>
66
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.0" />
7-
<PackageVersion Include="FluentFTP" Version="52.0.0" />
7+
<PackageVersion Include="FluentFTP" Version="52.1.0" />
88
<PackageVersion Include="Mapster" Version="7.4.0" />
9-
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="8.0.10" />
9+
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="9.0.3" />
1010
<PackageVersion Include="Microsoft.CSharp" Version="4.7.0" />
11-
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.10" />
12-
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
13-
<PackageVersion Include="System.Drawing.Common" Version="8.0.10" />
11+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.3" />
12+
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.3" />
13+
<PackageVersion Include="System.Drawing.Common" Version="9.0.4" />
1414
<PackageVersion Include="AutoMapper" Version="13.0.1" />
1515
<PackageVersion Include="CsvHelper" Version="33.0.1" />
16-
<PackageVersion Include="Esri.ArcGISRuntime" Version="200.6.0" />
17-
<PackageVersion Include="Fody" Version="6.9.1">
16+
<PackageVersion Include="Esri.ArcGISRuntime" Version="200.7.0" />
17+
<PackageVersion Include="Esri.ArcGISRuntime.Maui" Version="200.7.0" />
18+
<PackageVersion Include="Esri.ArcGISRuntime.Toolkit.Maui" Version="200.7.0" />
19+
<PackageVersion Include="Esri.ArcGISRuntime.WPF" Version="200.7.0" />
20+
<PackageVersion Include="Fody" Version="6.9.2">
1821
<PrivateAssets>all</PrivateAssets>
1922
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
2023
</PackageVersion>
21-
<PackageVersion Include="Magick.NET-Q16-AnyCPU" Version="14.4.0" />
24+
<PackageVersion Include="Magick.NET-Q16-AnyCPU" Version="14.6.0" />
2225
<PackageVersion Include="MetadataExtractor" Version="2.8.1" />
2326
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
2427
<PackageVersion Include="PropertyChanged.Fody" Version="4.1.0" />
25-
<PackageVersion Include="CommunityToolkit.Maui" Version="9.1.0" />
26-
<PackageVersion Include="Esri.ArcGISRuntime.Maui" Version="200.6.0" />
27-
<PackageVersion Include="Esri.ArcGISRuntime.Toolkit.Maui" Version="200.6.0" />
28+
<PackageVersion Include="CommunityToolkit.Maui" Version="11.2.0" />
2829
<PackageVersion Include="FubarDev.FtpServer" Version="3.1.2" />
2930
<PackageVersion Include="FubarDev.FtpServer.FileSystem.DotNet" Version="3.1.2" />
30-
<PackageVersion Include="Microsoft.Maui.Controls" Version="8.0.100" />
31-
<PackageVersion Include="Microsoft.Maui.Controls.Compatibility" Version="8.0.100" />
31+
<PackageVersion Include="Microsoft.Maui.Controls" Version="9.0.60" />
32+
<PackageVersion Include="Microsoft.Maui.Controls.Compatibility" Version="9.0.60" />
3233
<PackageVersion Include="Microsoft.Extensions.Logging.Debug" Version="8.0.0" />
3334
<PackageVersion Include="DesktopBridge.Helpers" Version="1.2.2" />
34-
<PackageVersion Include="Esri.ArcGISRuntime.WPF" Version="200.6.0" />
3535
<PackageVersion Include="gong-wpf-dragdrop" Version="4.0.0" />
3636
<PackageVersion Include="JKang.IpcServiceFramework.Client.Tcp" Version="3.1.0" />
3737
<PackageVersion Include="JKang.IpcServiceFramework.Hosting.Tcp" Version="3.1.0" />
38-
<PackageVersion Include="log4net" Version="3.0.3" />
39-
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
38+
<PackageVersion Include="log4net" Version="3.0.4" />
39+
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="9.0.3" />
4040
<PackageVersion Include="ModernWpfUI" Version="0.9.6" />
41-
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.9.0" />
41+
<PackageVersion Include="Swashbuckle.AspNetCore" Version="8.1.0" />
42+
<PackageVersion Include="System.Formats.Nrbf" Version="9.0.4" />
4243
</ItemGroup>
4344
</Project>

MapBoard.Core/Mapping/Model/LayerInfo/MapLayerCollection.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
using System.Diagnostics;
1212
using System.IO;
1313
using System.Linq;
14-
using System.Threading.Tasks;
14+
using System.Threading.Tasks;
1515
using MLayerCollection = MapBoard.Model.LayerCollection;
1616
using ELayerCollection = Esri.ArcGISRuntime.Mapping.LayerCollection;
1717
using MapBoard.IO;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System.ComponentModel;
2+
3+
namespace MapBoard.Query
4+
{
5+
public enum DateTimeOperator
6+
{
7+
[Description("等于")]
8+
EqualTo,
9+
10+
[Description("不等于")]
11+
NotEqualTo,
12+
13+
[Description("早于")]
14+
Before,
15+
16+
[Description("晚于")]
17+
After,
18+
19+
[Description("早于或等于")]
20+
OnOrBefore,
21+
22+
[Description("晚于或等于")]
23+
OnOrAfter,
24+
25+
[Description("为空")]
26+
IsNull,
27+
28+
[Description("不为空")]
29+
IsNotNull
30+
}
31+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.ComponentModel;
2+
3+
namespace MapBoard.Query
4+
{
5+
public enum NumberSqlOperator
6+
{
7+
[Description("等于")]
8+
EqualTo,
9+
10+
[Description("不等于")]
11+
NotEqualTo,
12+
13+
[Description("大于")]
14+
GreaterThan,
15+
16+
[Description("小于")]
17+
LessThan,
18+
19+
[Description("大于等于")]
20+
GreaterThanOrEqual,
21+
22+
[Description("小于等于")]
23+
LessThanOrEqual
24+
}
25+
}
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
6+
namespace MapBoard.Query
7+
{
8+
public static class QuerySqlBuilder
9+
{
10+
public static string Build(IList<SqlWhereClauseItem> items)
11+
{
12+
if (items == null || !items.Any())
13+
{
14+
return string.Empty;
15+
}
16+
17+
var sb = new StringBuilder();
18+
19+
for (int i = 0; i < items.Count; i++)
20+
{
21+
var item = items[i];
22+
23+
// 处理逻辑运算符前缀
24+
if (i > 0)
25+
{
26+
sb.Append($" {item.LogicalOperator.ToString().ToUpper()} ");
27+
}
28+
29+
// 处理特殊NULL判断
30+
if (IsNullOperator(item.ValueOperator))
31+
{
32+
sb.Append(BuildNullCheck(item));
33+
continue;
34+
}
35+
36+
// 构建常规条件
37+
sb.Append(BuildCondition(item));
38+
}
39+
40+
return sb.ToString();
41+
}
42+
43+
private static bool IsNullOperator(Enum op)
44+
{
45+
return op is StringSqlOperator { } sOp && (sOp == StringSqlOperator.IsNull || sOp == StringSqlOperator.IsNotNull)
46+
|| op is DateTimeOperator { } dOp && (dOp == DateTimeOperator.IsNull || dOp == DateTimeOperator.IsNotNull);
47+
}
48+
49+
private static string BuildNullCheck(SqlWhereClauseItem item)
50+
{
51+
var isNotNull = item.ValueOperator.ToString().EndsWith("NotNull");
52+
return $"{item.Field.Name} IS {(isNotNull ? "NOT " : "")}NULL";
53+
}
54+
55+
private static string BuildCondition(SqlWhereClauseItem item)
56+
{
57+
return item.ValueOperator switch
58+
{
59+
StringSqlOperator => BuildStringCondition(item),
60+
NumberSqlOperator => BuildSimpleCondition(item),
61+
DateTimeOperator => BuildDateTimeCondition(item),
62+
_ => throw new NotSupportedException("不支持的运算符类型")
63+
};
64+
}
65+
66+
private static string BuildStringCondition(SqlWhereClauseItem item)
67+
{
68+
var op = (StringSqlOperator)item.ValueOperator;
69+
var value = item.Value?.ToString();
70+
71+
return op switch
72+
{
73+
StringSqlOperator.Include => $"{item.Field.Name} LIKE '%{EscapeString(value)}%'",
74+
StringSqlOperator.NotInclude => $"{item.Field.Name} NOT LIKE '%{EscapeString(value)}%'",
75+
StringSqlOperator.StartWith => $"{item.Field.Name} LIKE '{EscapeString(value)}%'",
76+
StringSqlOperator.NotStartWith => $"{item.Field.Name} NOT LIKE '{EscapeString(value)}%'",
77+
StringSqlOperator.EndWith => $"{item.Field.Name} LIKE '%{EscapeString(value)}'",
78+
StringSqlOperator.NotEndWith => $"{item.Field.Name} NOT LIKE '%{EscapeString(value)}'",
79+
_ => $"{item.Field.Name} {GetComparisonOperator(op)} '{EscapeString(value)}'"
80+
};
81+
}
82+
83+
private static string BuildDateTimeCondition(SqlWhereClauseItem item)
84+
{
85+
var op = (DateTimeOperator)item.ValueOperator;
86+
return $"{item.Field.Name} {GetDateTimeOperator(op)} {FormatDateTime(item.Value)}";
87+
}
88+
89+
private static string BuildSimpleCondition(SqlWhereClauseItem item)
90+
{
91+
return $"{item.Field.Name} {GetComparisonOperator(item.ValueOperator)} {FormatValue(item.Value)}";
92+
}
93+
94+
private static string GetComparisonOperator(Enum op)
95+
{
96+
return op switch
97+
{
98+
NumberSqlOperator.EqualTo => "=",
99+
NumberSqlOperator.NotEqualTo => "<>",
100+
NumberSqlOperator.GreaterThan => ">",
101+
NumberSqlOperator.LessThan => "<",
102+
NumberSqlOperator.GreaterThanOrEqual => ">=",
103+
NumberSqlOperator.LessThanOrEqual => "<=",
104+
StringSqlOperator.EqualTo => "=",
105+
StringSqlOperator.NotEqualTo => "<>",
106+
_ => throw new ArgumentException("不支持的运算符")
107+
};
108+
}
109+
110+
private static string GetDateTimeOperator(DateTimeOperator op)
111+
{
112+
return op switch
113+
{
114+
DateTimeOperator.Before => "<",
115+
DateTimeOperator.After => ">",
116+
DateTimeOperator.OnOrBefore => "<=",
117+
DateTimeOperator.OnOrAfter => ">=",
118+
DateTimeOperator.EqualTo => "=",
119+
DateTimeOperator.NotEqualTo => "<>",
120+
_ => throw new ArgumentException("不支持的日期运算符")
121+
};
122+
}
123+
124+
private static string EscapeString(string value)
125+
{
126+
return value?.Replace("'", "''") ?? "";
127+
}
128+
129+
private static string FormatValue(object value)
130+
{
131+
return value switch
132+
{
133+
null => "NULL",
134+
DateTime dt => FormatDateTime(dt),
135+
string s => $"'{EscapeString(s)}'",
136+
_ => value.ToString()
137+
};
138+
}
139+
140+
private static string FormatDateTime(object value)
141+
{
142+
return value is DateTime dt
143+
? $"'{dt:yyyy-MM-dd HH:mm:ss}'"
144+
: "NULL";
145+
}
146+
}
147+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System.ComponentModel;
2+
3+
namespace MapBoard.Query
4+
{
5+
public enum SqlLogicalOperator
6+
{
7+
[Description("且")]
8+
And,
9+
[Description("或")]
10+
Or,
11+
}
12+
}

0 commit comments

Comments
 (0)