10

テーブルに次のような値を含む列があります

    "FilterA:123,234,34;FilterB:12,23;FilterC:;FilterD:45;"

フィルタは「;」で区切られます 各フィルターの値は「、」で区切られます。フィルタの名前とその値の間に「:」があります。

さて、値の部分だけをフェッチできることはできますか?「FilterA」の「123,234,34」のように。または、「FilterA」の値の部分で検索するために「234」のような番号を付けたり、「FilterB」の値の部分で「54」を指定したりできますか?正規表現を使用すれば可能だと思いますが、どうすればよいかわかりません。

4

4 に答える 4

13

正規表現はSQLに変換できないため、LinqtoEntitiesクエリで使用することはできません。String.Splitフィルタをで分割するために使用することもできません;。ここには2つのオプションがあります。

  • データベーステーブルの構造を変更します。たとえばFoo_Filter、エンティティをフィルターにリンクするテーブルを作成します。Filters次に、フィルターデータを含むテーブルを作成します。
  • メモリ内でクエリを実行し、LinqtoObjectsを使用します。データベースからメモリにすべてのデータをフェッチする必要があるため、このオプションは遅くなります
于 2013-01-19T19:24:28.853 に答える
4

基盤となるデータベースプロバイダーがSQLServerの場合、SqlMethods.Likeを使用して、データベースの結果セットを、RegExを使用してローカルで分析できるデータの管理可能なサブセットにフィルターすることができます。

于 2013-01-20T09:57:34.153 に答える
0

@lazyberezovskyの+1の場合、Linq to Entitiesで正規表現を実行することはできません。これは、SQLに変換できないためです。すべてのレコードをメモリにプルバックしてから、Linq to Objectsを実行できます(.ToList()変数に対して実行してから、この正規表現に対して2番目のlinqクエリを実行します)が、このクエリを処理するためにすべてのdbレコードをメモリにロードすることを意味します。同じ推奨事項:これを行う必要がないようにDB構造を変更します。

于 2013-01-19T19:29:29.390 に答える
0

データベースサーバーですべてを実行したい場合は、これらのフィルターを解析して、おそらく複数列のテーブルを返すことができるSQL関数が必要になると思います。残念ながら、私はサンプルコードを提供できるマシンを使用していません。

于 2013-01-19T19:36:37.940 に答える