2010-09-03 14 views
10

Dinamik olarak LINQ-to-SQL Where() çağrısı için bir derleme olarak kullanılan ve derlenen C# dilinde bir ifade ağacı oluşturmaya çalışıyorum. Sorun şu ki, bir Enum'u (temeldeki tür ile int) doğrudan bir Int ile karşılaştırmaya çalışıyorum, ancak bu, "MyEnumType üyesinin SQL'e desteklenen bir çevirisi yok" hatasıyla başarısız olması.Bir Expression.Equals işleminde kullanmak için Enum'u bir Int'e nasıl dönüştürebilirim?

Kodu:

ParameterExpression param = Expression.Parameter(typeof(MyClass), "obj"); //input parameter - this exposes a property of the Enum type 
MemberExpression enumMember = Expression.Property(param, "MyEnumProperty"); //used to get the Enum typed property from the parameter 

//MISSING STEP TO CAST THE ENUM OF THE MEMBER EXPRESSION TO AN INT? 

BinaryExpression binaryExpr = Expression.Equal(enumMember, Expression.Constant(1)); 
LambdaExpression<Func<MyClass, bool>> whereClause = Expression.Lambda(binaryExpr, param); 

//when whereClause is used to filter LINQ-to-SQL results, the error is thrown 

Ben ifade ağaçlara oldukça yeni ve ben bu anlamaya olamaz. Ben BinaryExpression ilk parçası olarak

Expression.Convert(enumMember, typeof(int)) 

kullanarak denedi ama bu onu düzeltmez.

Herhangi bir yardım çok takdir edilmektedir.

+0

biraz daha kazma sonra ifade ağaç –

+0

yılında enum nasıl gidilir değeri hakkında hiçbir fikrim yok bulur, burada sorun benim anlayış LINQ SQL ziyade ile olduğuna karar verdik İfadenin kendisi ile. Varlık nesnesindeki Enum özelliği, aslında veritabanındaki bir sütun değil; Bence bu onu bir fıkraya tercüme edememesi. Farklı bir yaklaşıma gidiyorum ama eğer herhangi bir anlayış varsa, paylaşmaktan çekinmeyin. –

+0

MyClass'ın kodunu da sağlayabilir misiniz? Şu anda yazdığınız kod oldukça boilerplate, buradan söyleyecek çok şey yok ... – code4life

cevap

0

böyle olmak

(int) enumMember 
+0

Bu derleme: "System.Linq.Expressions.MemberExpression 'türünü' int 'olarak değiştiremiyor" " –

+0

Heh, Sjoerd doğru olurdu ... eğer * enumMember * gerçek bir enum ve bir ifadenin bir ağaç soyutlaması olmasaydı. –

0

ilk siz enum değiştirmek zorunda hepsinden arkadaşım bakmak deneyin:

public enum myenum : int 
{ 
item1 = 0, 
item2 = 1 
} 

bundan sonra int ve bu arada o eunm arasında dönüştürebilirsiniz:

int x = (int) myenum.item1; 
+0

Bu yanıt, sorunun açık bir yanlış anlaşılmasıdır - OP, enum türleriyle çalışmak için ifade ağaçlarının nasıl kullanılacağını bilmek ister. Ayrıca - enumlar doğal olarak CLR'de 'int' tipindedir. Bu soru, C# ifadeleri için enumlar ile yapılan yüksek arama isabeti ve bu yanıtın @philsoady'den daha uygun bir yanıttan daha düşük olması gerektiğinden –

6

Basitçe, sen sürece LINQ SQL enum hakkında (daha doğrusu haritadan daha söyledim, gerek olmamalıdır int olarak ping ve 0 # ayrı özelliğine sahiptir. Örneğin, aşağıdaki çalışıyor:

var param = Expression.Parameter(typeof(DomainObject)); 
var body = Expression.Equal(Expression.Property(param, "SomeProperty"), 
         Expression.Constant(YourEnumType.SomeEnum)); 
var predicate = Expression.Lambda<Func<DomainObject, bool>>(body, param); 
var count = db.Table.Where(predicate).Count(); 

ana nokta benim SomeProperty mülkiyet enum için dbml içinde eşleştirilmiş olmasıdır. Tip ismini, enum tipiyle (isim alanı dahil) yazmanız yeterlidir.

Benzer şekilde, bir 1, ancak yazılan enum;

Expression.Constant(Enum.ToObject(typeof(YourEnumType), 1)) 

(tüm bildiklerini 1 ise) Marc Gravell için

1

teşekkür: örneğin. (İfade Guru!) Doğru cevaba bakınız. Bu senaryoyu karşılamak için bir İfade Düzeninde değişiklik yaptım. Normal özellikler veya Enums. Örtmek birisi bu yararlı

public static Expression<Func<TPoco, bool>> GetEqualsPredicate<TPoco>(string propertyName, 
                      object value) 
                      Type fieldType) 
    {  

     var parameterExp = Expression.Parameter(typeof(TPoco), @"t"); //(tpoco t) 
     var propertyExp = Expression.Property(parameterExp, propertyName);// (tpoco t) => t.Propertyname 

     var someValue = fieldType.IsEnum // get and eXpressionConstant. Careful Enums must be reduced 
        ? Expression.Constant(Enum.ToObject(fieldType, value)) // Marc Gravell fix 
        : Expression.Constant(value, fieldType); 

     var equalsExp = Expression.Equal(propertyExp, someValue); // yes this could 1 unreadble state if embedding someValue determination 

     return Expression.Lambda<Func<TPoco, bool>>(equalsExp, parameterExp); 
    }