12

LINQ 文字列をクエリに解析するためのベスト プラクティスと見なされる方法はどれですか?

言い換えれば、変換するのに最も理にかなっているアプローチは次のとおりです。

 string query = @"from element in source
                  where element.Property = ""param""
                  select element";

の中へ

 IEnumerable<Element> = from element in source 
                        where element.Property = "param"
                        select element;

ローカル スコープ内のorをsource参照すると仮定します。IEnumerable<Element>IQueryable<Element>

4

6 に答える 6

7

.NET 4.6 以降では、CSharpScript を使用して Linq を解析できます。解析したい式が文字列変数「クエリ」にあると仮定すると、次のようになります。

string query = "from element in source where element.Property = ""param"" select element";
IEnumerable result = null;
try 
{
    var scriptOptions = ScriptOptions.Default.WithReferences(typeof(System.Linq.Enumerable).Assembly).WithImports("System.Linq");
    result = await CSharpScript.EvaluateAsync<IEnumerable>(
             query,
             scriptOptions,
             globals: global);
} catch (CompilationErrorException ex) {
//
}

作業したい (データ) ソースを渡すことを忘れないでください。グローバル変数を使用して、スクリプトの解析でそれらにアクセスできます。

于 2016-07-20T10:53:23.883 に答える
5

テキストの解析とSystem.Linq.Expressionsの多用が必要です。私はここここでこれをいじりました。2 番目の記事のコードは、最初の記事からいくらか更新されていますが、まだラフなところがあります。私は時々これをいじり続けましたが、興味があれば投稿するつもりだった、ややクリーンなバージョンがあります。ANSI SQL 89 の優れたサブセットのサポートにかなり近づいています。

于 2011-03-23T02:35:04.130 に答える
3

C# 言語パーサーが必要になります (LINQ でサポートする C# 言語機能に応じて、少なくとも v3.5、場合によっては v4.0)。これらのパーサーの結果を取得し、ビジター パターンを使用して Expression ツリーに直接フィードします。まだ確信はありませんが、式ノードを完全に生成するには、なんらかの型分析も必要になると確信しています。

私はあなたと同じものを探していますが、それほど必要ではないので、一生懸命検索したり、これらの行に沿ってコードを書いたりしていません.

ユーザー文字列入力を受け取り、Microsoft.CSharp.CSharpCodeProviderコンパイラ プロバイダー クラスを使用して動的アセンブリにコンパイルするものを作成しました。コードの文字列を取得して結果を実行するだけの場合は、これで問題ありません。

私が作成したコンソール ツール LinqFilter の説明は次のとおりです。

http://bittwiddlers.org/?p=141

ソースリポジトリはこちら。LinqFilter/Program.cs は、コンパイラを使用して LINQ 式をコンパイルする方法を示しています。

http://bittwiddlers.org/viewsvn/trunk/public/LinqFilter/?root=WellDunne

于 2011-03-23T02:53:47.660 に答える
2

これは役立つ場合とそうでない場合がありますが、LINQ Dynamic Query Libraryを確認してください。

于 2011-03-23T03:02:23.903 に答える
2

これはうまくいくかもしれません: C#evalと同等ですか?

于 2011-03-23T01:57:22.147 に答える
0

これはあなたの質問に答える具体的な例ではありませんが、一般的にベストプラクティスは文字列から式ツリーを構築することだと思います。

この質問では、式ツリーの一部を構築することを示す文字列で linq クエリをフィルタリングする方法を尋ねましたただし、この概念を拡張して、文字列を表す式ツリー全体を構築できます。

Microsoftのこの記事を参照してください。

他にももっと良い投稿があるはずです。さらに、 RavenDBのようなものは、インデックスを定義するためのコード ベースで既にこれを行っていると思います。

于 2011-03-23T02:32:07.850 に答える