.net 该查询如何转换为动态Linq表达式?
考虑到“blah”和“groupe”是我必须搜索的关键字。要搜索的关键字的数量是可变的,这就是它需要动态搜索的地方。因此,我可以从0到数百个关键字中查找任意数量的关键字 感谢您的帮助!=).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”替换为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;
}