1

私はすでに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ラムダステートメントに変換するのに問題があります。ユーザーがボックスを選択foobazて入力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部分を無視しているようです。innerSQLプロファイラーはクエリを表示しません

4

3 に答える 3

1

Contains逆にa を使用できます。

string[] areaSplit = value.Split(',');
entities = entities.Where(x => areaSplit.Contains(x.area)); //1
entities = entities.Where(x => x.someField == value);

INこれは、SQL の句に変換されます。

WHERE (area IN (N'foo', N'baz')) AND (42 = someField)
于 2012-05-30T07:52:51.290 に答える
0

エオナスダン、

以下のpredicatebuilderをご覧になることをお勧めします。

http://www.albahari.com/nutshell/predicatebuilder.aspx

これは、説明どおりに動的フィルターを構築するための非常に優れた包括的な方法です。

于 2012-05-29T13:08:35.803 に答える
-1

イオナスダン

クエリ結果を返すメソッドで

public virtual ActionResult QueryWithMultipleParameters(int param1, int param2, int param3, ...)
{
    var query = dataContext.EntityToQuery;

    if(param1 > 0)
    {
        query = query.Where(e => e.param1 == param1);
    }
    if(param2 > 0)
    {
        query = query.Where(e => e.param2 == param2);
    }
    .... etc. 
    return query; 
}

お役に立てれば。

于 2012-05-29T13:34:16.853 に答える