3

LINQ を使用してデータベースにクエリを実行しようとしています。TableA と TableB を TableC と結合しています。

3 つのテーブルにまたがるいくつかのフィールド (LIKE '%%') 内で検索したい 0 個から多数の 'キーワード' (設計時にいくつあるかはわかりません) があります。

検索ボックスに 3 つのキーワードが入力されたとします。

T-SQLでは、これがあります-

SELECT tbl0.FieldA, tbl0.FieldB, tbl1.FieldC, tbl1.FieldD, tbl2.FieldE, tbl2.FieldF

FROM tbl0

JOIN tbl1 ON tbl0.KeyField = tbl1.KeyField

JOIN tbl2 ON tbl1.KeyField = tbl2.KeyField

WHERE (tbl0.FieldA LIKE '%{keyword1}%' OR tbl1.FieldC LIKE '%{keyword1}%' OR tbl2.FieldE LIKE '%{keyword1}%' OR tbl0.FieldA LIKE '%{keyword2}%' OR tbl1.FieldC LIKE '%{keyword2}%' OR tbl2.FieldE LIKE '%{keyword2}%' OR tbl0.FieldA LIKE '%{keyword3}%' OR tbl1.FieldC LIKE '%{keyword3}%' OR tbl2.FieldE LIKE '%{keyword3}%')

質問は -- LINQ でこの WHERE 句を「動的に」作成するにはどうすればよいですか?

注#1-(この質問の範囲外の理由で)3つのテーブルにまたがるビューを作成したくありません

注 2 - 私はこの方法で参加しているため (そして、まだ LINQ に慣れていないため)、どの TYPE (T) を渡すべきかわからないため、PredicateBuilder を使用する方法がわかりません。

注 #3 -- 重要な場合 ...最終的には、GridView に表示される (カスタム) オブジェクトの厳密に型指定されたリストを返すことを計画しています。

編集 - 2012 年 8 月 17 日 - 午後 5 時 15 分 (EDT)

下のコメントは正しいです。

「OPが探しているコードは、フィールドのいずれかにキーワードのいずれかが含まれている場所です。」

みんな、ありがとう!

4

1 に答える 1

3

PredicateBuilder を使用しないソリューションを次に示します。最初のキーワードを含むすべてのアイテムを取得し、2 番目のキーワードを含むすべてのアイテムとマージするだけです。問題のコンテキストについて何も知らないので、これが効率的かどうかはわかりません。

var query = from t0 in db.Table0
            join t1 in db.Table1 on t0.KeyField equals t1.KeyField
            join t2 in db.Table2 on t1.KeyField equals t2.KeyField
            select new
            {
                t0.FieldA, t0.FieldB,
                t1.FieldC, t1.FieldD,
                t2.FieldE, t2.FieldF
            };

string keyword = keywordsList[0];
var result = query.Where(x => x.FieldA.Contains(keyword) ||
                              x.FieldC.Contains(keyword) ||
                              x.FieldE.Contains(keyword));

for (int i = 1; i < keywordsList.Length; i++)
{
    string tempkey = keywordsList[i];
    result = result.Union(query.Where(x => x.FieldA.Contains(tempkey) ||
                                           x.FieldC.Contains(tempkey) ||
                                           x.FieldE.Contains(tempkey)));
}

result = result.Distinct();
于 2012-08-17T15:43:45.043 に答える