2010-07-20 14 views
5

Bir meslektaşım tarafından yazılmış bazı ifade ağacı kodları üzerinde çalışıyorum ve ek ifadeler ekleme olasılığını araştırıyorum. Şu anda destekler: eşittir, eşit olmayan, IsNull vb. SQL "Like" komutuna benzer bir joker karşılaştırma kullanmasına veya normal ifadeler kullanmasına izin verecek bir şey eklemem gerekir. Şu anda kod bir XML dosyasını ayrıştırmakta ve daha sonra aşağıda gösterilen çizgiye benzer bir kod kullanılarak işlenen verileri ayıklamaktadır. Bu “Eşit” ifadesinin bir örneğidir. “CallExp” tablonun (Varlıklar) alan adını temel olarak tutan bir GetExpression ve GetConstantExpression karşılaştırdığım verilerle ilgili ayrıntıları alır.SQL "Beğen" komutuna benzer bir şey yapmak için bir İfade Ağacı nasıl oluşturulur

xRet = Expression.MakeBinary(ExpressionType.Equal, callExp, GetConstantExpression(element.Element("Value"), callExp.Type)); 

Ne Peşinde olduğum “Beğen” komutuna benzer bir “İfade” oluşturmak için bir yoldur. Bu, yukarıdakine benzer birkaç çizgi kullanılarak yapılabilir mi yoksa bu daha karmaşık mı olacak? Bu alanda yardımcı olabilecek iyi kaynaklar var mı?

================================= ====================================

görüşleri doğrultusunda

Yeni kod:

Bazı örneklere bakıyordum ve bana bir İfade yaratacağını umduğum aşağıdakileri denedim. Bana aşağıda gösterilen hatayı veriyor. “StartsWith” ifadesi oluşturmak için doğru yönde mi gidiyorum? _entityExp, MyClass'a bir ParameterExpression referansıdır.

ParameterExpression p = Expression.Parameter(_entityExp.Type, "entity"); 
MethodInfo method = typeof(string).GetMethod("StartsWith", new[] { typeof(string) }); 
var containsMethodExp = Expression.Call(p, method, Expression.Constant("root"), p); 

Yöntemi 'Boole startswith (System.string)' tür 'System.string' ilan

cevap

7

İfade ağaç benzeri 'sınıfla'

+0

"StartsWith" çalışmalarına devam etmeye karar verdim. Yukarıdaki kodu düzenledim ama bir hata alıyorum. Bununla doğru yönde mi gidiyorum? – Retrocoder

+0

@Retrocoder: Hayır, hata oldukça doğru. String.StartsWith (string) 'i çağırmaya çalışıyor ancak dize olmayan bir argüman sağlıyorsunuz. Ya argümanı bir dize olarak değiştirmelisiniz ya da ihtiyacınız olan imzayla kendi 'StartsWith' yönteminizi yazmalısınız. –

2

Kullanım Contains, startswith or endswith tip örneği ile adı olamaz can yalnızca .NET dillerinde olduğu gibi aynı işlevsellik tipini temsil eder - yöntem çağrıları, özellik değerlendirmesi vs.

Normalde "beğen" e en yakın olanı, string.StartsWith, string.EndsWith r string.Contains. Bunun yerine normal ifadelerle ilgilenmek istiyorsanız, bunun yerine Regex.IsMatch'u kullanmak isteyebilirsiniz. Her iki şekilde de, bu, ifade ağaçlarının kendisinin "dili" yerine, yöntemleri içinde kapsüllenmiş bir şeydir.

İfade ağaçlarınızın nasıl tüketildiği hakkında daha fazla bilgi sahibi olmadan, tam olarak ne yapmanız gerektiğini söylemek zor. , ürününün, tüketicinin uygun şekilde fark edeceği ve işleyebileceği "Beğen" yöntemini oluşturabilir, örneğin ... veya mevcut dize/regex yöntemlerini kullanabilirsiniz.

+0

Bu işe yarar ama aynı zamanda joker kartlarını kullanabilme şansına da sahip oldum – Retrocoder

İlgili konular