.net 该查询如何转换为动态Linq表达式?

.net 该查询如何转换为动态Linq表达式?,.net,linq,search,dynamic,.net,Linq,Search,Dynamic,考虑到“blah”和“groupe”是我必须搜索的关键字。要搜索的关键字的数量是可变的,这就是它需要动态搜索的地方。因此,我可以从0到数百个关键字中查找任意数量的关键字 感谢您的帮助!=) 在那里,您可以将“blah”或“groupe”替换为txtCompanyName.Text和txtCityName.Text(如果筛选器文本位于文本框中)似乎有加入内部筛选器的命令或类似命令。让我们将此代码作为我的CreateFilter方法的首字母 var result = (from oCompanyIn

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

感谢您的帮助!=)


在那里,您可以将“blah”或“groupe”替换为txtCompanyName.Text和txtCityName.Text(如果筛选器文本位于文本框中)

似乎有加入内部筛选器的命令或类似命令。让我们将此代码作为我的
CreateFilter
方法的首字母

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()
私有表达式
CreateFilter(搜索条件){
var outerFilter=PredicateBuilder.True();
outerFilter=outerFilter.And(ci=>!ci.IsDeleted&&ci.IsBindingApproved);
var innerFilter=PredicateBuilder.False();
foreach(criteria.Keywords中的var关键字){
var w=关键字;
innerFilter=innerFilter.Or(ci=>ci.Name.Contains(w)
||ci.CityName.Contains(w))
}
outerFilter=outerFilter.和(innerFilter);
if(criteria.HasCityName)
outerFilter=outerFilter.And(ci=>
ci.CityName.Contains(criteria.CityName));
//其他类似的过滤器在这里。。。
返回外部过滤器;
}
这并没有返回正确的结果。然后,根据本文:,我更改了代码

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;
}
私有表达式
CreateFilter(搜索条件){
var innerFilter=PredicateBuilder.False();
foreach(criteria.Keywords中的var关键字){
var w=关键字;
innerFilter=innerFilter.Or(ci=>ci.Name.Contains(w)
||ci.CityName.Contains(w))
}
var outerFilter=PredicateBuilder.True();
outerFilter=outerFilter.And(ci=>!ci.IsDeleted&&ci.IsBindingApproved);
if(criteria.HasCityName)
outerFilter=outerFilter.And(ci=>
ci.CityName.Contains(criteria.CityName));
//其他类似的过滤器在这里。。。
//在这里,我们只想在关键字上包含过滤器
//有些人提供了搜索。
//否则,将显示没有关键字的And(innerFilter)的结果
//将始终为“false”,并且通过其他条件不返回任何结果
//可能会遇到诸如CityName和其他任何名称。
如果(criteria.HasKeywords)outerFilter=outerFilter.And(innerFilter);
返回外部过滤器;
}

而且它工作得完美无缺!我真的不明白为什么结果是完美的,因为过滤器的顺序似乎会影响结果,这对我很有用。

感谢您对我的帮助!=)除此之外,我仍然遇到同样的问题,这个Linq查询将只接受两个、两个和两个必须的关键字。我将无法提供超过或少于两个关键字它。这正是我希望避免的,并使之充满活力
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;
}
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;
}