2011-11-09 6 views
0

私は、文字列の配列をとるクエリ式を持っており、クエリに基づいていくつかのアイテムを返すクエリを生成する必要があります。しかし、何も返さない。私は閉鎖の問題があると思うが、私はそれが何であるか分からない。 クエリ式のクロージャ

 public static Expression<Func<Item, bool>> IsKnownByIn(string[] query) 
     { 
     var i = PredicateBuilder.True<Item>(); 
     foreach (string keyword in query) 
     { 
      string temp = keyword; 
      i = i.And(p=> p.Name.Contains(temp) || p.ID.ToString().Contains(temp)); 
     } 
     return i; 
    } 

は、私は、クエリ内の唯一の最後の文字列が返されることになり.Contains(キーワード)で.Contains(TEMP)を交換してみました。さらに、i.Andをi.Orに置き換えると、すべての項目(問合せ内の文字列を含まない項目も含む)が戻されます。問題が隠れている可能性のあるアイデアはありますか?あなたがまたはをしようとしたとき

+0

クエリ内のすべてのキーワードまたは少なくとも1つのキーワードと一致するアイテムに一致するアイテムを返すようにしますか? – hatchet

+0

少なくとも1つのキーワード – tehdoommarine

答えて

1

は、あなたが本当で始まるので、すなわち

真か何かか何か

は常にtrueになりますそれらすべてを得ました。代わりに、iの構成をFalseに変更します。

あなたが提示したコードでは、PredicateBuilderを使用してループ内に構築する際のtempへの割り当てキーワードが正しい方法です。

EDIT:

私の質問へのご回答に基づいて、私はこれだろう。

public static Expression<Func<Item, bool>> IsKnownByIn(string[] query) 
{ 
var i = PredicateBuilder.False<Item>(); 
foreach (string keyword in query) 
{ 
    string temp = keyword; 
    i = i.Or(p=> p.Name.Contains(temp) || p.ID.ToString().Contains(temp)); 
} 
return i; 

}

+0

がその場で問題を解決しました、ありがとうございます。 – tehdoommarine

1

をですから、クエリで指定すべてのキーワードを持つアイテムを持っているのですか?これらはフィルタを通過できる唯一のものでなければなりません。おそらく、代わりにOrを使うべきです。問題は、PredicateBuilder.Trueから始まるので、「trueまたはexpr1またはexpr2 ... exprn」は常にtrueになります。 PredicateBuilder.Falseを使用した場合、おそらくより多くのコードを表示して、問題の原因を突き止めることができます。