feat(control): support selected extended search columns
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user