0

私のデータベースフィールドにはPositions、スペースで区切られた位置コードのリストを含むフィールドがあります。ローカルで指定された位置コードのいずれかがフィールド内の位置コードの少なくとも1つと一致するかどうかをチェックする基準をクエリに追加する必要があります。

たとえば、とを含むローカルリストが"RB"あり"LB"ます。位置の値がであるレコードと、位置の値がであるが位置の値がでないレコードをOL LB検索する必要があります。RB OTOT OL

AND句を使用すると、これを簡単に行うことができます。

foreach (var str in localPositionList)
    query = query.Where(x => x.Position.Contains(str);

ただし、これをまたは句として連鎖させる必要があります。Linq-to-sql(すべての通常のコレクション)を扱っていなかった場合は、これを行うことができます

query = query.Where(x => x.Positions.Split(' ').Any(y => localPositionList.contains(y)));

ただし、分割をSQLに変換できないために例外が発生するため、これはLinq-to-sqlでは機能しません。

これを達成する方法はありますか?

このテーブルの唯一の目的は、検索結果を取得するために最小限のテーブルを必要とするデータの最適化された「キャッシュ」を提供することであるため、私はこのデータをこのテーブルから他のテーブルに分割することに抵抗しようとしています(最終的にはこの部分をSolrに移動しますが、スケジュールのため、現時点では実行できません)。

4

1 に答える 1

1

個別のクエリを使用し、結果に対して a を実行することで、テスト バージョンを動作させることができましたUnion。ハッキングしただけなので、私のコードは大雑把ですが、ここにあります...

        List<string> db = new List<string>() {
            "RB OL",
            "OT LB",
            "OT OL"
        };

        List<string> tests = new List<string> {
            "RB", "LB", "OT"
        };

        IEnumerable<string> result = db.Where(d => d.Contains("RB"));

        for (int i = 1; i < tests.Count(); i++) {
            string val = tests[i];
            result = result.Union(db.Where(d => d.Contains(val)));
        }

        result.ToList().ForEach(r => Console.WriteLine(r));

        Console.ReadLine();
于 2012-04-20T16:35:49.667 に答える