【问题标题】:How would this query translate into a dynamic Linq expression?该查询如何转换为动态 Linq 表达式?
【发布时间】:2012-01-23 20:34:31
【问题描述】:
select *
    from bis.CompanyInfo ci
    where ci.IsDeleted = 0
        and ci.IsBindingApproved = 1
        and ((ci.[Name] like N'%blah%'
            or ci.CityName like N'%blah%')
            or (ci.[Name] like N'%groupe%'
                or ci.CityName like N'%groupe%'))

考虑到“blah”和“groupe”是我必须搜索的关键字。要搜索的关键字数量是可变的,这就是它需要动态的地方。因此,我可以查找从 0 到数百个任意数量的关键字。

感谢任何帮助! =)

【问题讨论】:

    标签: .net linq search dynamic


    【解决方案1】:
    var result = (from oCompanyInfo as CompanyInfo in CompanyInfoList
                 where oCompanyInfo.IsDeleted = 0 and oCompanyInfo.IsBindingApproved = 1 and             
                 (Name.Contains("blah") or oCompanyInfo.CityName.Contains("blah") or
                 oCompany.Name.Contains("groupe") or oCompany.CityName.Contains("groupe"))
                 select oCompanyInfo).ToList()
    

    您可以在此处将“blah”或“groupe”替换为 txtCompanyName.Text 和 txtCityName.text(如果过滤器文本在文本框中)

    【讨论】:

    • 感谢您有兴趣帮助我! =)除此之外,我仍然遇到同样的问题,这个 Linq 查询将只接受两个且只接受两个和强制性的两个关键字。我将无法为它提供多于或少于两个关键字。这就是我希望避免并使其充满活力的。 =)
    【解决方案2】:

    似乎有一个命令或类似的东西加入内部过滤器。让我们将此代码作为我的 CreateFilter 方法的初始代码。

    private Expression<Func<CompanyInfo, bool>> 
        CreateFilter(SearchCriterion criterion) {
        var outerFilter = PredicateBuilder.True<CompanyInfo>();
        outerFilter = outerFilter.And(ci => !ci.IsDeleted && ci.IsBindingApproved);
    
        var innerFilter = PredicateBuilder.False<CompanyInfo>();
        foreach(var keyword in criterion.Keywords) {
            var w = keyword;
            innerFilter = innerFilter.Or(ci => ci.Name.Contains(w)
                                            || ci.CityName.Contains(w))
        }
        outerFilter = outerFilter.And(innerFilter);
    
        if (criterion.HasCityName)
            outerFilter = outerFilter.And(ci => 
                ci.CityName.Contains(criterion.CityName));
    
        // Other similar filter here...
    
        return outerFilter;
    }
    

    这没有返回正确的结果。然后,根据这篇文章:LINQ: Complicated Advanced Search with Dynamic Where Clause,我更改了我的代码。

    private Expression<Func<CompanyInfo, bool>> 
        CreateFilter(SearchCriterion criterion) {
        var innerFilter = PredicateBuilder.False<CompanyInfo>();
        foreach(var keyword in criterion.Keywords) {
            var w = keyword;
            innerFilter = innerFilter.Or(ci => ci.Name.Contains(w)
                                            || ci.CityName.Contains(w))
        }
        var outerFilter = PredicateBuilder.True<CompanyInfo>();
        outerFilter = outerFilter.And(ci => !ci.IsDeleted && ci.IsBindingApproved);
    
        if (criterion.HasCityName)
            outerFilter = outerFilter.And(ci => 
                ci.CityName.Contains(criterion.CityName));
    
        // Other similar filter here...
    
        // Here, we want to include the filter on keywords only when there are 
        // some provided with the search.
        // Otherwise, the result of the And(innerFilter) with no keywords
        // will always be 'false' and return no results though other criterion
        // might be met such as the CityName and whatever the others are.
        if (criterion.HasKeywords) outerFilter = outerFilter.And(innerFilter);
    
        return outerFilter;
    }
    

    而且它完美无瑕!我真的不明白为什么结果是完美的,只是因为过滤器的顺序会影响结果,这对我有用。

    【讨论】:

      猜你喜欢
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      相关资源
      最近更新 更多