Programsal olarak bir ifade ağacı oluşturmaya çalışıyorum. Benim girişi varOrElse ve AndAlso ifade yöntemlerini kullanarak özel durum
aşağıdaki formu var koşul sınıfları listesi: Ben Expression
nesneyi oluştururken
public class Filter
{
public string field { get; set; }
public string operator { get; set; }
public string value { get; set; }
}
aşağıdaki şekilde
foreach (Filter sf in rules) {
Expression ex = sf.ToExpression(query);
if (mainExpression == null) {
mainExpression = ex;
}
else {
if (logicalCondition == "AND") {
mainExpression = Expression.And(mainExpression, ex);
}
else if (logicalCondition == "OR") {
mainExpression = Expression.Or(mainExpression, ex);
}
}
}
her durum için bir
Expression
oluşturmak
Filter.ToExpression() yöntemi, bu
public override Expression ToExpression(IQueryable query) {
ParameterExpression parameter = Expression.Parameter(query.ElementType, "p");
MemberExpression memberAccess = null;
foreach (var property in field.Split('.'))
memberAccess = MemberExpression.Property(memberAccess ?? (parameter as Expression), property);
ConstantExpression filter = Expression.Constant(Convert.ChangeType(value, memberAccess.Type));
WhereOperation condition = (WhereOperation)StringEnum.Parse(typeof(WhereOperation), operator);
LambdaExpression lambda = BuildLambdaExpression(memberAccess, filter, parameter, condition, value);
return lambda;
}
gibi uygulanan
ikili operatör Veya tanımlanmadı: Tek bir şartım var ama
And
,Or
,AndAlso
,OrElse
statik yöntemlerden birini kullanarak ifadeleri birleştirmek çalıştığımda diyor birInvalidOperationException
aldığınızdaHer şey çalışıyor 'System.Func
2[MyObject,System.Boolean]' and 'System.Func
2 [MyObject, System.Boolean]' türleri için.
Biraz kafam karıştı. Birisi istisnanın nedenlerini daha iyi açıklayabilir ve bir çözüm önerebilir mi?
Çok teşekkürler!
Merhaba, cevabınız için teşekkürler. Bu sorunu çözmek için üçüncü taraf kodunu kullanamıyorum. Bunu el ile yapmanın yolu hangisi daha iyi olur? Tekrar teşekkürler! – Lorenzo
@Lorenzo Sure, örnek olarak kullandığım iki ifadeye dayalı bir program ekledim. – hvd
Merhaba, çözümünüzü uygulamaya çalıştım. “ExpressionVisitor” un LinqKit kaynaklarından geldiğini ve nasıl çalıştığını görebildiğini anladım. Şimdi soru şudur: IEnumerable '' Zip' yönteminden nereden geliyor? .NET 3.5 kullanıyorum ve şu yöntemi bulamıyorum :( –
Lorenzo