3

特定のレコードのさまざまな列のいずれかにキーワードが含まれているかどうかを確認する検索方法を作成しようとしています。

私のLinqステートメントは次のとおりです。

string[] searchFilter = {"john", "iceberg"};


var q = from qua in qual
                    join del in deliverables on qua.ID equals del.Q_ID
                    where searchFilter.All(s => (qua.Name + " " + qua.Project + " " + qua.Summary + " " + del.Name + " " + del.Summary).ToLower().Contains(s))
                    select qua;

ただし、「ローカル シーケンスは、Contains() 演算子以外のクエリ演算子の LINQ to SQL 実装では使用できません」というエラー メッセージが表示されます。

4

3 に答える 3

1

実際、All メソッドは使用できませんが、Contains メソッドのみを使用できます。

var q = from qua in qual
        join del in deliverables on qua.ID equals del.Q_ID
        where searchFilter.Contains(qua.Name) ||  searchFilter.Contains(qua.Project)...
        select qua;

もちろん、linq クエリを式と動的に組み合わせることができます (ただし、はるかに多くの作業が必要になる可能性があります)。動的 linq を使用することもできます。

于 2012-07-30T13:44:54.830 に答える
1

選択肢があるとは思わないでください:

しかし、「クエリ可能な」世界にとどまっていると、これは1つのSQLリクエストのみを生成します(醜いですが...)

var q = from qua in qual
        join del in deliverables on qua.ID equals del.Q_ID
        select new{ qua, del};

foreach (var filter in searchFilter)
     q = q.Where(v => (v.qua.Name + " " + v.qua.Project + " " + v.qua.Summary + " " + v.del.Name + " " + v.del.Summary).ToLower().Contains(filter));

var result = q.Select(p => p.qua);
于 2012-07-30T13:59:54.807 に答える
0

何らかの理由でcontainsメソッドは、ループを2回通過したときに、フィルター処理された結果を使用していませんでした。最終的に機能したアプローチは次のとおりです。

var SearchColumn = from qua in Qual
               join del in deliverables on qua.Q_ID equals del.Q_ID into left_j
                            from del in left_j.DefaultIfEmpty()
                            select new { qua.Name + " " + qua.Project + " " + qua.Summary + " " + del.Name + " " + del.Summary).ToLower() };

foreach (var f in searchFilter)
{
   var likestr = string.Format("%{0}%", f);
   SearchColumn = SearchColumn.Where(x => SqlMethods.Like(x.Search_Col, likestr));
}
于 2012-08-01T18:28:13.363 に答える