以下のコードは、Listから継承するTのGenericクラスにあります。そのため、オブジェクトについて何もわからなくて、なぜ渡すのかメソッドの列名IQueryable.QueryProvider.CreateQuery例外:「引数式が無効です」
例外はメソッドのほとんどの行に表示されます。
public decimal? Max (string column)
{
IQueryable<T> queryableData = this.AsQueryable<T>();
// Compose the expression tree that represents the parameter to the predicate.
ParameterExpression pe = Expression.Parameter(typeof(T), "item");
// ***** Select(item => item.[column]) *****
// Create an expression tree that represents the expression 'item.[column] == "id"'
Expression left = null;
try
{
left = Expression.Property(pe, typeof(T).GetProperty(column, System.Type.EmptyTypes));
}
catch
{
}
// Create an expression tree that represents the expression
// 'queryableData.Select(item => item.[column]) '
MethodCallExpression whereCallExpression = null;
try
{
whereCallExpression = Expression.Call(
typeof(Queryable),
"Select",
new Type[] { queryableData.ElementType, typeof(int) },
queryableData.Expression,
Expression.Lambda<Func<T, int>>(left, new ParameterExpression[] { pe }));
}
catch
{
}
IQueryable<T> results = null;
string lexpression = whereCallExpression.ToString();
// Create an executable query from the expression tree.
//Exception at this line of Code:
results= queryableData.Provider.CreateQuery<T>(whereCallExpression);
return Convert.ToInt32(results.Max());
}
(すなわちwhereCallEWxpression)に渡された式は正しいように見えますが、この例外が来る続ける:「引数の式が有効ではありません」。私は本当に立ち往生しており、解決策を見つけることができませんでした。
また、誰かがこれを達成するためのより良い方法を知っている場合は、私が思うことができるすべてを教えてください。
おかげで、
ロベルト
編集: whereCallExpressionにcontructionは、おそらく間違っています。問題はそれを解決する方法です。それは本当に私が理解できない難しいビットです。
編集2: try catch catchブロックが削除されました - デバッグ目的でのみそこにありました。
あなた 'try'..'catch'使用することは愚かなようだ:あなたは実際にはしないでください例外が発生しないようにします( 'results'が' null'になるため、以前に何かが失敗した場合は 'return'文に例外が発生します)。 – hvd
hvd - それは戻りません。 CreateQueryを呼び出すと例外がスローされます。明らかにwhereCallExpressionの構築は間違っています。それは私には間違ってどのように明確ではない。 –
@RobertoBoniniこれは幾分OTですが、簡潔にするためにキャッチブロックの内容を省略しない限り、彼の指摘はまだまだあります。 –