Bir ifade ağacı oluşturmaya çalışıyorum. Veri tablosundaki verileri okumam ve sütunlarını kontrol etmem gerekiyor. Kontrol edilecek kolonlar ve ayrıca kontrol edilecek kolon sayısı sadece çalışma zamanında bilinir. Sütun adları, bir dize dizisi olarak bana verilir ve her bir sütun, denetlenecek bir dizi Dizeye sahiptir. Aşağıdaki örnekte olduğu gibi örnek ifade ağaçları denedim.HATA Statik yöntem null örneği gerektirir, statik olmayan yöntem null olmayan örnek gerektirir
Burada bir hatayla karşılaşıyorum.
Statik yöntem null örneğini gerektirir, statik olmayan yöntem null olmayan örnek gerektirir. Parametre adı: Örnek
çizgisinde
= Expression.Call (rowexp, mi, colexp) iç;
Lütfen bana yardım edin!
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 }));
Yukarıdakilere biraz detay verebilir misiniz? Neden Yöntem bilgilerini burada ilk ifade olarak Expression.Call yöntemine iletiyorsunuz? – Kobojunkie
@Kobojunkie: Bu, Expression.Call'a hangi statik yöntemle ilgilendiğimizi anlattığınız içindir. Bkz. Http://msdn.microsoft.com/en-us/library/bb301084.aspx –