2

文字列から Lambda ベースの Linq 式を作成するのに苦労しています。このサンプルオブジェクト/クラスを使用した私の基本的なケースは次のとおりです。

public class MockClass
{
    public string CreateBy { get; set; }
}

基本的に、次のように文字列を変換する必要があります。

string stringToConvert = “x => x.CreateBy.Equals(filter.Value, StringComparison.OrdinalIgnoreCase”;

to predicate/linq 式に:

System.Linq.Expressions.Expression<Func<T, bool>>  or in this example 
System.Linq.Expressions.Expression<Func<MockClass, bool>>

したがって、以下の Where メソッド内の Linq 式と同等です。

query = query.Where(x => x.CreateBy.Equals(filter.Value,
StringComparison.OrdinalIgnoreCase));

次のヘルパーを使用してみましたが、事前にわからない文字列からlinq式を構築できるようにしたいこのタイプのケースでそれらを機能させる方法を理解できないようです: http: //www.albahari.com/nutshell/predicatebuilder.aspx

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx (NuGet パッケージとして利用できるようになりました。よく「DynamicQuery」と呼ばれます)

4

1 に答える 1

1

同様の質問がここで尋ねられました:

(ラムダ式) 文字列を解析して Action デリゲートにする簡単な方法はありますか?

私が理解しているように、この「動的クエリ」は実際には、ラムダ式を使用せずに Where 句の制限を渡すためのフレームワークです。

その意味は、ラムダ式は動的メソッドではなく、匿名メソッドであるということです。アセンブリを調べてみると、ラムダ式がフィールドとして自由変数を持つクロージャに変換されていることがわかります。クラスには、あなたのものと一致する署名を持つメソッドがあり、フィールド変数は呼び出しの時点で割り当てられます。

これについて考える良い方法の 1 つは、ラムダ式がコンパイル時に c# コンパイラによって解釈され、実行時にこのクラスからオブジェクトをインスタンス化することによって変数が解決されることを意味することです。

これを実証するために、次のことを考慮してください。

var myLambda = x => x * x

これが機能しないことに気付くでしょう。これは、関連するクラス/メソッドを作成するために、コンパイラがコンパイル時に x の型を認識している必要があるためです。

ラムダ式の概念は実行時の CLR には存在しないため (コード内と同じ形式で)、これらすべてが重要です。ラムダ式のように見える文字列はまさにそれです...

于 2012-04-11T23:32:18.807 に答える