式ツリーを作成しようとしています。データテーブルからデータを読み込み、その列をチェックする必要があります。チェックされる列とチェックされる列の数は、実行時にのみ認識されます。列名は文字列配列として私に与えられ、各列にはチェックされる文字列のリストがあります。私は以下のようなサンプル表現ツリーを試しました。ERROR静的メソッドにはnullインスタンスが必要です。非静的メソッドにはnull以外のインスタンスが必要です
ここでエラーが発生しました。
静的メソッドにはnullインスタンスが必要です。非静的メソッドにはnull以外のインスタンスが必要です。 パラメータ名:インスタンス
線で
= Expression.Call(rowexp、MI、colexp)インナー。
親切に私を助けてください!
IQueryable<DataRow> queryableData = CapacityTable
.AsEnumerable()
.AsQueryable()
.Where(row2 => values.Contains(row2.Field<string>("Head1").ToString())
&& values.Contains(row2.Field<string>("Head2").ToString()));
MethodInfo mi = typeof(DataRowExtensions).GetMethod(
"Field",
new Type[] { typeof(DataRow),typeof(string) });
mi = mi.MakeGenericMethod(typeof(string));
ParameterExpression rowexp = Expression.Parameter(typeof(DataRow), "row");
ParameterExpression valuesexp = Expression.Parameter(typeof(List<string>), "values");
ParameterExpression fexp = Expression.Parameter(typeof(List<string>), "types");
Expression inner, outer, predicateBody = null;
foreach (var col in types)
{
// DataRow row = CapacityTable.Rows[1];
ParameterExpression colexp = Expression.Parameter(typeof(string), "col");
// Expression left = Expression.Call(pe, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
inner = Expression.Call(rowexp,mi, colexp);
outer = Expression.Call(valuesexp, typeof(List<string>).GetMethod("Contains"), inner);
predicateBody = Expression.And(predicateBody,outer);
}
MethodCallExpression whereCallExpression = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { queryableData.ElementType },
queryableData.Expression,
Expression.Lambda<Func<DataRow,bool>>(predicateBody, new ParameterExpression[] { rowexp }));
上記の内容を少し詳しく説明できますか?ここでExpression.Callメソッドの最初の引数としてMethod情報を渡すのはなぜですか? – Kobojunkie
@Kobojunkie:これは、Expression.Callに私たちが興味を持っている静的メソッドを伝える方法です。http://msdn.microsoft.com/en-us/library/bb301084.aspxを参照してください。 –