私はすでにSOでいくつかの質問を確認し、Googleを試しましたが、これを機能させるには至りませんでした。ユーザーが入力してドロップダウンを選択できる検索ページがあり、0から10のフィールドに入力できます。(「すべての」結果を返すことが可能です)。複数選択できるフィールドができるまではうまく機能しています
<select name="area" size="25" multiple="multiple">
<option>foo</option>
<option>bar</option>
<option>baz</option>
<!--blah blah blah-->
</select>
<input name="someField"/>
これをEFラムダステートメントに変換するのに問題があります。ユーザーがボックスを選択foo
しbaz
て入力42
するとしsomeField
ます。検索ではarea
、いずれかが含まれている場合の結果が返され、の値が正しい必要がありますsomeField
。
//...
var entities = db.entities;
//... this is inside of a switch/loop through the forms collection
string value = Request.Form[key];
//...
If (area <> "") {
string[] areaSplit = value.Split(',');
foreach (string s in subSplit)
{
string temp = s;
entities.Where(x => x.area.Contains(temp)); //1
}
}
//...
entities.Where(x => x.someField == value);
だから、どこ//1
が排他的であってはならないのか。つまりentities.area
、フォームフィールドの値のいずれかを持つことができますarea
。SQLクエリで私はおそらく書くでしょう
... someField = 42 and (area = 'foo' or area = 'baz')
代わりにSQLクエリを作成する方が良い(効率的でベストプラクティス)のでしょうか?
predicatebuilderを使用して編集します
var outer = PredicateBuilder.True<entity>();
var inner = PredicateBuilder.False<entity>();
//... this is inside of a switch/loop through the forms collection
string value = Request.Form[key];
//...
string[] areaSplit = value.Split(',');
foreach (string s in subSplit)
{
string temp = s;
inner = inner.Or(x => x.area.Contains(temp)); //1
}
//..
outer = outer.And(x => x.someField == value);
//...end of loop
outer.And(inner.Expand());
var foo = db.entity.AsExpandable().Where(outer.Expand());
しかし、それはそのinner
部分を無視しているようです。inner
SQLプロファイラーはクエリを表示しません