我需要对数据集执行LINQ搜索,以查找搜索键匹配所有列中所有值的所有数据行。例如,在数据网格中有这样的数据集:
Province Code Region
==================================
Alessandria AL Piemonte
Aosta AO Valle d'Aosta
Varese VA Lombardia在代码中表示为List<Province> tableData和存储在param.Search.Value中的搜索键。在下面的代码中,我过滤了网格中所有可搜索的列,并在tableData上执行搜索
if (param.Search != null && !string.IsNullOrEmpty(param.Search.Value))
{
var columns = param.Columns.GetAllSearchableColumns();
searchedData.AddRange(param.SelectMatchingData(tableData, columns));
}我使用两个扩展来执行搜索:
public static IEnumerable<T> SelectMatchingData<T>(this IDataTablesRequest param, IEnumerable<T> tableData, List<Column> columns)
{
return tableData.SelectMany(entity => columns, (entity, column) => new { entity, column })
.Select(@t => new { @t, isMatch = @t.entity.GetMatchingValue(@t.column.Name, param.Search.Value) })
.Where(@t => @t.isMatch)
.Select(@t => @t.@t.entity);
}
public static bool GetMatchingValue(this object src, string propertyName, string valueToMatch)
{
if (src == null)
{
return false;
}
var propertyValue = src.GetType().GetProperty(propertyName).GetValue(src, null).ToString();
return propertyValue.Trim().ToLower().StartsWith(valueToMatch.Trim().ToLower());
}当我使用'va‘作为搜索键时,结果是:
Province Code Region
==================================
Aosta AO Valle d'Aosta
Varese VA Lombardia
Varese VA Lombardia因为Varese在值Varese和VA上是匹配的。
如何改进LINQ代码以避免重复?
发布于 2015-02-26 11:23:19
您可以使用Distinct()删除重复项。然而,尽管这样做会“解决”问题,但它将用算法掩盖问题:与其在事后消除重复,不如从一开始就不添加重复。
可以将SelectMatchingData更改为在Any()条件下展开列,避免重复检查:
public static IEnumerable<T> SelectMatchingData<T>(this IDataTablesRequest param, IEnumerable<T> tableData, List<Column> columns) {
return tableData
.Where(entity => columns.Any(column => entity.GetMatchingValue(column.Name, param.Search.Value)));
}https://stackoverflow.com/questions/28740926
复制相似问题