2012-01-23 3 views
0
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에서 수백 개의 키워드를 찾을 수 있습니다.이 쿼리는 어떻게 동적 Linq 표현식으로 변환됩니까?

도움을 주시면 감사하겠습니다. 필터 텍스트) 텍스트 상자에있는 경우가 주문이 나처럼 =) 당신이 txtCompanyName.Text 및 txtCityName.text에 "ㅋ"또는 "Groupe의"를 대체 할 수있다

답변

0

보인다 the-like 내부 필터를 결합하십시오. 이 코드를 내 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; 
} 

그리고 완벽하게 작동합니다. 나는 결과가 필터의 순서가 결과에 영향을주는 것처럼 보이는 이유를 이해하지 못한다.

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() 

(

+0

나를 도와 주셔서 감사합니다. =) 제쳐두고, 나는 여전히 같은 문제가 붙어 있는데,이 Linq 질의는 오직 2 개와 2 개의 필수 키워드만을 받아 들일 것입니다. 두 개 이상의 키워드를 제공 할 수 없습니다. 그것이 내가 피하고 싶고 역동적으로 만들고자하는 바입니다. =) –

+0

+1. –