2

単一のデータベースフィールドにコンマ区切りのリストとしてデータ要素が格納されているレガシーデータベースがあります。(私はそれを設計しませんでした、私はそれに固執しています。)

DBフィールドの「配列」の個々の値のいずれかに一致させたい文字列のリストがありますが、Linqでこれを行う方法がわかりません。

私のリスト:

List<string> items= new List<string>();
items.Add("Item1");  
items.Add("Item2"); 

DBフィールド「Products」には、次のようなデータが含まれます。

"Item1,Item3,Item4"
"Item3,Item5,Item6"
"Item2,Item7,Item6"
"Item1,Item2"
"Item1"

Linqクエリでの最初のパスは次のとおりです。

var results = (from o in Order
.Where(p=> items.Contains(p.Products)

しかし、私はそれがうまくいかないことを知っています。「Item1」または「Item2」のみを含むレコードのみが返されるためです。したがって、上記の例のデータでは、0レコードが返されます。2つのレコードを返すようにする必要があります。

助言がありますか?

4

2 に答える 2

1

カンマ区切りのリストを検索するための簡単な巧妙なトリックがあります。,まず、ターゲット値(製品リスト)の最初と最後、および検索値にエクストラを追加します。次に、その正確な文字列を検索します。したがって、たとえば、を検索,Item1,Item3,Item4,,Item1,ます。これの目的は、誤検知を防ぐことです。つまり、リストの最初/最後にあるアイテムを適切に見つけられるようにしながらItem12,Item3、に一致するものを見つけることです。Item1

次に、LINQ.Anyメソッドを使用して、次のように、リスト内のすべてのアイテムが製品リストと一致することを確認できます。

var results = (from o in Order
    .Where(o => items.Any(i => (","+o.Products+",").Contains(","+i+",")))
于 2013-03-04T21:06:32.223 に答える
0

Products1つの方法は、フィールドのリストを解析することです。

var results = (from o in Order
    .Where(o => items.Any(i => o.Products.Split(',').Contains(i))

ただし、レコードごとに文字列を複数回解析します。すべてのレコードをプルバックし、各レコードを1回解析してから、比較を行うことができます。

var results = from o in Order
              let prods = o.Products.Split(',')
              where items.Any(i => prods.Contains(i))
              select o;
于 2013-03-04T21:05:02.640 に答える