feat(control): support selected extended search columns

This commit is contained in:
2026-07-31 10:30:15 +08:00
parent c5b6466fab
commit 7e819b44b7
@@ -78,6 +78,11 @@ namespace Lskj.Control.Model
}
public static string BuildSearchSql(string sourceSql, DataColumnCollection columns, int maxRows)
{
return BuildSearchSql(sourceSql, columns, maxRows, string.Empty);
}
public static string BuildSearchSql(string sourceSql, DataColumnCollection columns, int maxRows, string searchField)
{
if (columns == null || columns.Count == 0)
{
@@ -88,17 +93,50 @@ namespace Lskj.Control.Model
throw new ArgumentOutOfRangeException("maxRows", "最大返回行数必须大于零。");
}
List<DataColumn> searchColumns = new List<DataColumn>();
string selectedField = (searchField ?? string.Empty).Trim();
if (selectedField.Length == 0)
{
foreach (DataColumn column in columns)
{
if (IsSearchableColumn(column.ColumnName))
{
searchColumns.Add(column);
}
}
}
else
{
foreach (DataColumn column in columns)
{
if (string.Equals(column.ColumnName, selectedField, StringComparison.OrdinalIgnoreCase) &&
IsSearchableColumn(column.ColumnName))
{
searchColumns.Add(column);
break;
}
}
}
if (searchColumns.Count == 0)
{
if (selectedField.Length > 0)
{
throw new InvalidOperationException(string.Format("搜索字段“{0}”不存在或不允许查询。", selectedField));
}
throw new InvalidOperationException("搜索 SQL 没有返回任何可查询列。");
}
string alias = QuoteIdentifier(SearchAlias);
StringBuilder builder = new StringBuilder();
builder.AppendFormat("select top ({0}) * from ({1}) as {2} where ", maxRows, NormalizeSourceSql(sourceSql), alias);
for (int i = 0; i < columns.Count; i++)
for (int i = 0; i < searchColumns.Count; i++)
{
if (i > 0) builder.Append(" or ");
builder.Append("convert(nvarchar(4000), ");
builder.Append(alias);
builder.Append('.');
builder.Append(QuoteIdentifier(columns[i].ColumnName));
builder.Append(QuoteIdentifier(searchColumns[i].ColumnName));
builder.Append(") like ");
builder.Append(SearchParameterName);
builder.Append(" escape N'\\'");
@@ -106,6 +144,12 @@ namespace Lskj.Control.Model
return builder.ToString();
}
public static bool IsSearchableColumn(string columnName)
{
return !string.IsNullOrWhiteSpace(columnName) &&
!columnName.StartsWith("_", StringComparison.Ordinal);
}
public static string BuildLikeParameterValue(string keyword)
{
string value = keyword ?? string.Empty;