2012-01-23 2 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

に思えます内部フィルタを結合するようなものです。このコードを私の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つの義務的な2つのキーワードしか受け入れません。私は2つ以上のキーワードを提供することはできません。それは私が避けたい、そしてダイナミックにしたいものです。 =) –

+0

+1それはショットを与える。 –

関連する問題