2012-01-23 52 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表達式?

任何幫助表示讚賞! =)

回答

0

好像有一個命令或像加入內部過濾器一樣。讓我們把這個代碼作爲我的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() 

在那裏,你可以取代「嗒嗒」或「GROUPE」到txtCompanyName.Text和txtCityName.text(如果過濾文本是一個文本框)

+0

感謝您對我的幫助! =)另外,我仍然遇到同樣的問題,這個Linq查詢將只接受兩個且只有兩個和強制性的兩個關鍵字。我將無法提供多於或少於兩個關鍵字。這是我希望避免並使之動態的。 =) –

+0

+1給它一個鏡頭。 –

相關問題