Skip to content

Commit d95a76f

Browse files
committed
2 parents 754ddae + 89fa5c7 commit d95a76f

File tree

11 files changed

+166
-38
lines changed

11 files changed

+166
-38
lines changed

XCode/Code/EntityBuilder.cs

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -403,7 +403,7 @@ protected virtual void AddNameSpace()
403403
protected virtual void AddExtendNameSpace()
404404
{
405405
var us = Option.Usings;
406-
if(!Option.ExtendNameSpace.IsNullOrEmpty())
406+
if (!Option.ExtendNameSpace.IsNullOrEmpty())
407407
Option.ExtendNameSpace.Trim().Split(',').ToList().ForEach(space => us.Add(space));
408408
}
409409

@@ -1685,6 +1685,7 @@ protected virtual Boolean BuildExtendFind(IDataColumn[] columns, Int32 index)
16851685

16861686
var builder = new SearchBuilder(Table) { Nullable = Option.Nullable };
16871687
var ps = builder.GetParameters(columns);
1688+
var pdic = ps.ToDictionary(e => e.Name);
16881689

16891690
// 如果方法名已存在,则不生成
16901691
var key = $"{methodName}({ps.Join(",", e => e.TypeName.TrimEnd('?'))})";
@@ -1693,32 +1694,34 @@ protected virtual Boolean BuildExtendFind(IDataColumn[] columns, Int32 index)
16931694

16941695
if (index > 0) WriteLine();
16951696
WriteLine("/// <summary>根据{0}查找</summary>", columns.Select(e => e.DisplayName).Join("、"));
1696-
foreach (var dc in columns)
1697+
foreach (var pi in ps)
16971698
{
1698-
WriteLine("/// <param name=\"{0}\">{1}</param>", dc.CamelName(), dc.DisplayName);
1699+
WriteLine("/// <param name=\"{0}\">{1}</param>", pi.ParameterName, pi.DisplayName);
16991700
}
17001701

17011702
var nullable = EntityOption.Nullable;
17021703

1703-
var args = ps.Join(", ", e => $"{e.TypeFullName} {e.Name}");
1704+
var args = ps.Join(", ", e => $"{e.TypeFullName} {e.ParameterName}");
17041705
WriteLine("/// <returns>实体对象</returns>");
17051706
WriteLine("public static {2} {0}({1})", methodName, args, ClassName + (nullable ? "?" : ""));
17061707
WriteLine("{");
17071708
{
17081709
var header = false;
17091710
foreach (var dc in columns)
17101711
{
1712+
if (!pdic.TryGetValue(dc.Name, out var pi)) continue;
1713+
17111714
if (dc.DataType != null && dc.DataType.IsInt())
1712-
WriteLine("if ({0} < 0) return null;", dc.CamelName());
1715+
WriteLine("if ({0} < 0) return null;", pi.ParameterName);
17131716
else if (dc.DataType == typeof(String))
17141717
{
17151718
if (nullable && dc.Nullable)
1716-
WriteLine("if ({0} == null) return null;", dc.CamelName());
1719+
WriteLine("if ({0} == null) return null;", pi.ParameterName);
17171720
else
1718-
WriteLine("if ({0}.IsNullOrEmpty()) return null;", dc.CamelName());
1721+
WriteLine("if ({0}.IsNullOrEmpty()) return null;", pi.ParameterName);
17191722
}
17201723
else if (dc.DataType == typeof(DateTime) && IsDataTime(dc))
1721-
WriteLine("if ({0}.Year < 1000) return null;", dc.CamelName());
1724+
WriteLine("if ({0}.Year < 1000) return null;", pi.ParameterName);
17221725

17231726
header |= CanSearch(dc);
17241727
}
@@ -1727,14 +1730,16 @@ protected virtual Boolean BuildExtendFind(IDataColumn[] columns, Int32 index)
17271730
var wh = new StringBuilder();
17281731
foreach (var dc in columns)
17291732
{
1733+
if (!pdic.TryGetValue(dc.Name, out var pi)) continue;
1734+
17301735
if (exp.Length > 0) exp.Append(" & ");
1731-
exp.AppendFormat("_.{0} == {1}", dc.Name, dc.CamelName());
1736+
exp.AppendFormat("_.{0} == {1}", dc.Name, pi.ParameterName);
17321737

17331738
if (wh.Length > 0) wh.Append(" && ");
17341739
if (dc.DataType == typeof(String))
1735-
wh.AppendFormat("e.{0}.EqualIgnoreCase({1})", dc.Name, dc.CamelName());
1740+
wh.AppendFormat("e.{0}.EqualIgnoreCase({1})", dc.Name, pi.ParameterName);
17361741
else
1737-
wh.AppendFormat("e.{0} == {1}", dc.Name, dc.CamelName());
1742+
wh.AppendFormat("e.{0} == {1}", dc.Name, pi.ParameterName);
17381743
}
17391744

17401745
var singleCache = false;
@@ -1748,19 +1753,20 @@ protected virtual Boolean BuildExtendFind(IDataColumn[] columns, Int32 index)
17481753
if (columns.Length == 1)
17491754
{
17501755
var pk = columns[0];
1756+
var pi = pdic[pk.Name];
17511757
if (pk.PrimaryKey)
17521758
{
17531759
WriteLine();
17541760
WriteLine("// 单对象缓存");
1755-
WriteLine("return Meta.SingleCache[{0}];", pk.CamelName());
1761+
WriteLine("return Meta.SingleCache[{0}];", pi.ParameterName);
17561762

17571763
singleCache = true;
17581764
}
17591765
else if (pk.Master)
17601766
{
17611767
WriteLine();
17621768
WriteLine("// 单对象缓存");
1763-
WriteLine("return Meta.SingleCache.GetItemWithSlaveKey({0}) as {1};", pk.CamelName(), ClassName);
1769+
WriteLine("return Meta.SingleCache.GetItemWithSlaveKey({0}) as {1};", pi.ParameterName, ClassName);
17641770

17651771
singleCache = true;
17661772
}
@@ -1789,6 +1795,7 @@ protected virtual Boolean BuildExtendFindAll(IDataColumn[] columns, Int32 index)
17891795

17901796
var builder = new SearchBuilder(Table) { Nullable = Option.Nullable };
17911797
var ps = builder.GetParameters(columns);
1798+
var pdic = ps.ToDictionary(e => e.Name);
17921799

17931800
// 如果方法名已存在,则不生成
17941801
var key = $"{methodName}({ps.Join(",", e => e.TypeName.TrimEnd('?'))})";
@@ -1797,30 +1804,32 @@ protected virtual Boolean BuildExtendFindAll(IDataColumn[] columns, Int32 index)
17971804

17981805
if (index > 0) WriteLine();
17991806
WriteLine("/// <summary>根据{0}查找</summary>", columns.Select(e => e.DisplayName).Join("、"));
1800-
foreach (var dc in columns)
1807+
foreach (var pi in ps)
18011808
{
1802-
WriteLine("/// <param name=\"{0}\">{1}</param>", dc.CamelName(), dc.DisplayName);
1809+
WriteLine("/// <param name=\"{0}\">{1}</param>", pi.ParameterName, pi.DisplayName);
18031810
}
18041811

1805-
var args = ps.Join(", ", e => $"{e.TypeFullName} {e.Name}");
1812+
var args = ps.Join(", ", e => $"{e.TypeFullName} {e.ParameterName}");
18061813
WriteLine("/// <returns>实体列表</returns>");
18071814
WriteLine("public static IList<{2}> {0}({1})", methodName, args, ClassName);
18081815
WriteLine("{");
18091816
{
18101817
var header = false;
18111818
foreach (var dc in columns)
18121819
{
1820+
if (!pdic.TryGetValue(dc.Name, out var pi)) continue;
1821+
18131822
if (dc.DataType != null && dc.DataType.IsInt())
1814-
WriteLine("if ({0} < 0) return [];", dc.CamelName(), ClassName);
1823+
WriteLine("if ({0} < 0) return [];", pi.ParameterName, ClassName);
18151824
else if (dc.DataType == typeof(String))
18161825
{
18171826
if (Option.Nullable && dc.Nullable)
1818-
WriteLine("if ({0} == null) return [];", dc.CamelName());
1827+
WriteLine("if ({0} == null) return [];", pi.ParameterName);
18191828
else
1820-
WriteLine("if ({0}.IsNullOrEmpty()) return [];", dc.CamelName(), ClassName);
1829+
WriteLine("if ({0}.IsNullOrEmpty()) return [];", pi.ParameterName, ClassName);
18211830
}
18221831
else if (dc.DataType == typeof(DateTime) && IsDataTime(dc))
1823-
WriteLine("if ({0}.Year < 1000) return [];", dc.CamelName());
1832+
WriteLine("if ({0}.Year < 1000) return [];", pi.ParameterName);
18241833

18251834
header |= CanSearch(dc);
18261835
}
@@ -1829,14 +1838,16 @@ protected virtual Boolean BuildExtendFindAll(IDataColumn[] columns, Int32 index)
18291838
var wh = new StringBuilder();
18301839
foreach (var dc in columns)
18311840
{
1841+
if (!pdic.TryGetValue(dc.Name, out var pi)) continue;
1842+
18321843
if (exp.Length > 0) exp.Append(" & ");
1833-
exp.AppendFormat("_.{0} == {1}", dc.Name, dc.CamelName());
1844+
exp.AppendFormat("_.{0} == {1}", dc.Name, pi.ParameterName);
18341845

18351846
if (wh.Length > 0) wh.Append(" && ");
18361847
if (dc.DataType == typeof(String))
1837-
wh.AppendFormat("e.{0}.EqualIgnoreCase({1})", dc.Name, dc.CamelName());
1848+
wh.AppendFormat("e.{0}.EqualIgnoreCase({1})", dc.Name, pi.ParameterName);
18381849
else
1839-
wh.AppendFormat("e.{0} == {1}", dc.Name, dc.CamelName());
1850+
wh.AppendFormat("e.{0} == {1}", dc.Name, pi.ParameterName);
18401851
}
18411852

18421853
if (UsingCache)
@@ -1966,6 +1977,7 @@ protected virtual IList<IDataColumn> BuildAdvanceSearch(SearchBuilder builder)
19661977
var returnName = ClassName;
19671978

19681979
var ps = builder.GetParameters(cs, true);
1980+
var pdic = ps.ToDictionary(e => e.Name);
19691981

19701982
// 如果方法名已存在,则不生成
19711983
var key = $"Search({ps.Join(",", e => e.TypeName.TrimEnd('?'))})";
@@ -1974,9 +1986,10 @@ protected virtual IList<IDataColumn> BuildAdvanceSearch(SearchBuilder builder)
19741986

19751987
// 注释部分
19761988
WriteLine("/// <summary>高级查询</summary>");
1977-
foreach (var dc in cs)
1989+
foreach (var pi in ps)
19781990
{
1979-
WriteLine("/// <param name=\"{0}\">{1}</param>", dc.CamelName(), dc.Description);
1991+
if (!pi.Extend)
1992+
WriteLine("/// <param name=\"{0}\">{1}</param>", pi.ParameterName, pi.Description);
19801993
}
19811994

19821995
var dcTime = builder.DataTime;
@@ -1990,7 +2003,7 @@ protected virtual IList<IDataColumn> BuildAdvanceSearch(SearchBuilder builder)
19902003
WriteLine("/// <returns>实体列表</returns>");
19912004

19922005
// 参数部分
1993-
var pis = ps.Join(", ", e => $"{e.TypeFullName} {e.Name}");
2006+
var pis = ps.Join(", ", e => $"{e.TypeFullName} {e.ParameterName}");
19942007
WriteLine("public static IList<{0}> Search({1})", returnName, pis);
19952008
WriteLine("{");
19962009
{
@@ -2000,14 +2013,16 @@ protected virtual IList<IDataColumn> BuildAdvanceSearch(SearchBuilder builder)
20002013
WriteLine();
20012014
foreach (var dc in cs)
20022015
{
2016+
if (!pdic.TryGetValue(dc.Name, out var pi)) continue;
2017+
20032018
if (dc.DataType.IsInt() && (dc.DataType.IsEnum || !dc.Properties["Type"].IsNullOrEmpty()))
2004-
WriteLine("if ({0} >= 0) exp &= _.{1} == {0};", dc.CamelName(), dc.Name);
2019+
WriteLine("if ({0} >= 0) exp &= _.{1} == {0};", pi.ParameterName, dc.Name);
20052020
else if (dc.DataType.IsInt())
2006-
WriteLine("if ({0} >= 0) exp &= _.{1} == {0};", dc.CamelName(), dc.Name);
2021+
WriteLine("if ({0} >= 0) exp &= _.{1} == {0};", pi.ParameterName, dc.Name);
20072022
else if (dc.DataType == typeof(Boolean))
2008-
WriteLine("if ({0} != null) exp &= _.{1} == {0};", dc.CamelName(), dc.Name);
2023+
WriteLine("if ({0} != null) exp &= _.{1} == {0};", pi.ParameterName, dc.Name);
20092024
else if (dc.DataType == typeof(String))
2010-
WriteLine("if (!{0}.IsNullOrEmpty()) exp &= _.{1} == {0};", dc.CamelName(), dc.Name);
2025+
WriteLine("if (!{0}.IsNullOrEmpty()) exp &= _.{1} == {0};", pi.ParameterName, dc.Name);
20112026
}
20122027

20132028
if (dcTime != null)

XCode/Code/ParameterModel.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,24 @@
33
/// <summary>参数模型</summary>
44
public class ParameterModel
55
{
6-
/// <summary>参数名</summary>
6+
/// <summary>名称</summary>
77
public String Name { get; set; } = null!;
88

9+
/// <summary>参数名</summary>
10+
public String ParameterName { get; set; } = null!;
11+
912
/// <summary>类型名。简称</summary>
1013
public String TypeName { get; set; } = null!;
1114

1215
/// <summary>类型全名。含命名空间</summary>
1316
public String TypeFullName { get; set; } = null!;
17+
18+
/// <summary>显示名</summary>
19+
public String? DisplayName { get; set; }
20+
21+
/// <summary>描述</summary>
22+
public String? Description { get; set; }
23+
24+
/// <summary>是否扩展参数</summary>
25+
public Boolean Extend { get; set; }
1426
}

XCode/Code/SearchBuilder.cs

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,25 @@ public IList<IDataColumn> GetColumns()
158158
// return ps;
159159
//}
160160

161+
private static readonly HashSet<String> _reservedNames = new(StringComparer.Ordinal)
162+
{
163+
// 关键字
164+
"abstract", "as", "base", "bool", "break", "byte", "case", "catch", "char", "checked",
165+
"class", "const", "continue", "decimal", "default", "delegate", "do", "double", "else",
166+
"enum", "event", "explicit", "extern", "false", "finally", "fixed", "float", "for",
167+
"foreach", "goto", "if", "implicit", "in", "int", "interface", "internal", "is", "lock",
168+
"long", "namespace", "new", "null", "object", "operator", "out", "override", "params",
169+
"private", "protected", "public", "readonly", "ref", "return", "sbyte", "sealed", "short",
170+
"sizeof", "stackalloc", "static", "string", "struct", "switch", "this", "throw", "true",
171+
"try", "typeof", "uint", "ulong", "unchecked", "unsafe", "ushort", "using", "virtual",
172+
"void", "volatile", "while",
173+
// 上下文关键字
174+
"add", "alias", "and", "ascending", "async", "await", "by", "descending", "dynamic",
175+
"equals", "file", "from", "get", "global", "group", "init", "into", "join", "let",
176+
"nameof", "nint", "not", "notnull", "nuint", "on", "or", "orderby", "partial", "record",
177+
"remove", "required", "scoped", "select", "set", "unmanaged", "value", "var", "when",
178+
"where", "with", "yield"
179+
};
161180
/// <summary>获取参数列表。名称+类型(全名+简名)</summary>
162181
/// <param name="columns"></param>
163182
/// <param name="extend"></param>
@@ -175,7 +194,18 @@ public IList<ParameterModel> GetParameters(IList<IDataColumn> columns, Boolean e
175194
else if (dc.DataType == typeof(String) && Nullable && dc.Nullable)
176195
type += "?";
177196

178-
var model = new ParameterModel { Name = dc.CamelName(), TypeName = type, TypeFullName = type };
197+
var model = new ParameterModel
198+
{
199+
Name = dc.Name,
200+
ParameterName = dc.CamelName(),
201+
TypeName = type,
202+
TypeFullName = type,
203+
DisplayName = dc.DisplayName,
204+
Description = dc.Description,
205+
};
206+
207+
// 处理保留字
208+
if (_reservedNames.Contains(model.ParameterName)) model.ParameterName = "@" + model.ParameterName;
179209

180210
var p = type.LastIndexOf('.');
181211
if (p > 0) model.TypeName = type[(p + 1)..];
@@ -187,11 +217,11 @@ public IList<ParameterModel> GetParameters(IList<IDataColumn> columns, Boolean e
187217
{
188218
if (DataTime != null)
189219
{
190-
ps.Add(new ParameterModel { Name = "start", TypeName = "DateTime", TypeFullName = "DateTime" });
191-
ps.Add(new ParameterModel { Name = "end", TypeName = "DateTime", TypeFullName = "DateTime" });
220+
ps.Add(new ParameterModel { Name = "start", ParameterName = "start", TypeName = "DateTime", TypeFullName = "DateTime", Extend = true });
221+
ps.Add(new ParameterModel { Name = "end", ParameterName = "end", TypeName = "DateTime", TypeFullName = "DateTime", Extend = true });
192222
}
193-
ps.Add(new ParameterModel { Name = "key", TypeName = "String", TypeFullName = "String" });
194-
ps.Add(new ParameterModel { Name = "page", TypeName = "PageParameter", TypeFullName = "PageParameter" });
223+
ps.Add(new ParameterModel { Name = "key", ParameterName = "key", TypeName = "String", TypeFullName = "String", Extend = true });
224+
ps.Add(new ParameterModel { Name = "page", ParameterName = "page", TypeName = "PageParameter", TypeFullName = "PageParameter", Extend = true });
195225
}
196226

197227
return ps;

XCodeTool/CubeBuilder.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,12 +339,17 @@ private String BuildSearch()
339339
var cs = builder.GetColumns();
340340
if (cs.Count <= 0) return null;
341341

342+
var ps = builder.GetParameters(cs);
343+
var pdic = ps.ToDictionary(e => e.Name);
344+
342345
var sb = Pool.StringBuilder.Get();
343346

344347
var pis = new List<String>();
345348
foreach (var dc in cs)
346349
{
347-
var name = dc.CamelName();
350+
//var name = dc.CamelName();
351+
if (!pdic.TryGetValue(dc.Name, out var pi)) continue;
352+
var name = pi.ParameterName;
348353

349354
if (dc.DataType.IsInt())
350355
{

XUnitTest.XCode/Code/Entity/字典参数.Biz.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ public override Boolean Valid(DataMethod method)
9393
// entity.Category = "abc";
9494
// entity.Name = "abc";
9595
// entity.Value = "abc";
96+
// entity.Readonly = true;
9697
// entity.LongValue = "abc";
9798
// entity.Kind = 0;
9899
// entity.Enable = true;

0 commit comments

Comments
 (0)