首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对没有重复项的实体列表的所有属性执行LINQ搜索

对没有重复项的实体列表的所有属性执行LINQ搜索
EN

Stack Overflow用户
提问于 2015-02-26 11:12:38
回答 1查看 1.3K关注 0票数 2

我需要对数据集执行LINQ搜索,以查找搜索键匹配所有列中所有值的所有数据行。例如,在数据网格中有这样的数据集:

代码语言:javascript
运行
复制
    Province        Code    Region
    ==================================
    Alessandria     AL      Piemonte
    Aosta           AO      Valle d'Aosta
    Varese          VA      Lombardia

在代码中表示为List<Province> tableData和存储在param.Search.Value中的搜索键。在下面的代码中,我过滤了网格中所有可搜索的列,并在tableData上执行搜索

代码语言:javascript
运行
复制
    if (param.Search != null && !string.IsNullOrEmpty(param.Search.Value))
    {
        var columns = param.Columns.GetAllSearchableColumns();
        searchedData.AddRange(param.SelectMatchingData(tableData, columns));
    }

我使用两个扩展来执行搜索:

代码语言:javascript
运行
复制
    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‘作为搜索键时,结果是:

代码语言:javascript
运行
复制
    Province        Code    Region
    ==================================
    Aosta           AO      Valle d'Aosta
    Varese          VA      Lombardia
    Varese          VA      Lombardia

因为Varese在值Varese和VA上是匹配的。

如何改进LINQ代码以避免重复?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-26 11:23:19

您可以使用Distinct()删除重复项。然而,尽管这样做会“解决”问题,但它将用算法掩盖问题:与其在事后消除重复,不如从一开始就不添加重复。

可以将SelectMatchingData更改为在Any()条件下展开列,避免重复检查:

代码语言:javascript
运行
复制
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)));
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28740926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档