2

複数の列とやや複雑なテキストパターンを格納する1つの列を含むデータテーブルがあります-フィールドを解析して、特定のサブ文字列がより大きな文字列パターン内の特定の位置に存在するかどうかを判断し、レコードを次のように除外する必要があるかどうかを判断する必要があります結果。

String.Splitメソッド呼び出し、foreachなどを使用してC#解析関数を作成する以外に、解析を実行する方法がわかりません。しかし、次のように解析しようとすると、次のようになります。

var myFilteredTable = _db.MyTable.Where(t => t.Column1 == 'Filter1' 
                                        && ParseIsMyItemInColumn2(t) );

「SQLへの変換はサポートされていません」というエラーが表示されます。

私が考えたもう1つのオプションは、解析なしで初期結果を作成することでした。

var myFilteredTable = _db.MyTable.Where(t => t.Column1 == 'Filter1' );

IQueryableの結果セットを反復処理し、解析関数を使用して各行をテストし、不要な行を除外しますが、IQueryableには、不要な行を削除するRemove関数や、新しい結果セットを作成するためのAdd関数がありません。

では、Parse関数も作成する必要がある場合、linqでフィルター処理するにはどうすればよいですか?

4

2 に答える 2

2

「データベースの最初のフィルターをローカルで実行してから、残りをローカルで実行する」のは簡単です。

var filtered = _db.MyTable.Where(t => t.Column1 == "Filter1")
                          .AsEnumerable() // Do the rest locally
                          .Where(t => ParseIsMyItemInColumn2(t));

AsEnumerableは単純なパススルーメソッドですが、結果はではIEnumerable<T>なくとして入力されるためIQueryable<T>、後続のLINQ操作では、のメソッドでEnumerableはなく、のLINQtoObjectsメソッドが使用されQueryableます。

明らかに、多くのアイテムが最初のフィルターに一致するが、2番目のフィルターに失敗した場合、それはひどく効率的ではありません...

于 2012-08-31T17:30:41.953 に答える
2

残念ながら、「解析関数」がSQLに変換できるものでない場合は、結果をプルしてLINQtoObjectsを使用する必要があります。

var myFilteredTable = _db.MyTable.Where(t => t.Column1 == 'Filter1')
                         .AsEnumerable().Where(ParseIsMyItemInColumn2);

これにより、すべての結果がメモリにストリーミングされてから、解析が実行されることに注意してください。

于 2012-08-31T17:30:58.283 に答える