2010-10-21 29 views
5

Estoy utilizando Enterprise Library. Quiero asignar la columna (de tipo entero) a Enum Type.C# Lambda Expression Mapping Multiple Conditions

Say columna

Enum BloodGroup Type 
{ 

    OPositive, 
    ONegative, 
    ABPositive, 
    ABNegative, 
    BPositive, 
    BNegative, 
    NotSet 
} 

estoy mapeo de la tabla de base de datos de propiedades de C# (Tipos de clase a los empleados).

IRowMapper<Employee> addressMapper = MapBuilder<Employee> 
       .MapAllProperties() // map all properties 
       .Map(p=>p.BloodGroup) // override BloodGroup property 
       .WithFunc(rec => rec.IsDBNull(rec.GetOrdinal("BloodGroup")) 
       ? BloodGroup.NotSet 
       : BloodGroup.OPositive) 
       .Build(); 

Código funcionando bien pero quiero asignar múltiples condiciones de Enumeración de WithFun extensión Method.I significa algo así como

.WithFun(rec=> rec.IsDBNull(rec.GetOrdinal("BloodGroup")) ? BloodGroup.NotSet 
       rec.GetOrdinal("BloodGroup")==1 ?BloodGroup.OPositive 
       rec.GetOrdinal("BloodGroup")==2 ?BloodGroup.ONegative 
     ) 

ayudar a que compruebe la condición múltiple?

+0

¿Es NHibernate ??? – Aliostad

+0

No Enterprise Library 5.0 – IExtensible

Respuesta

2
rec.IsDBNull(rec.GetOrdinal("BloodGroup")) ? BloodGroup.NotSet : 
rec.GetOrdinal("BloodGroup")==1 ? BloodGroup.OPositive : 
rec.GetOrdinal("BloodGroup")==2 ? BloodGroup.ONegative : 
BloodGroup.NotSet 

Todo lo que necesita agregar son dos puntos y una última expresión. Ver ternary operator.

+0

Sí Funciona bien – IExtensible

1

uso

.WithFunc((rec) => { 
if(rec.IsDBNull(rec.GetOrdinal("BloodGroup")) 
    return BloodGroup.NotSet; 
else if(rec.GetOrdinal("BloodGroup")==1) 
    return BloodGroup.OPositive; 
else if(rec.GetOrdinal("BloodGroup")==2) 
    return BloodGroup.ONegative; 
    ..... // you get the idea   
}) 
. // rest 

Básicamente se puede utilizar llaves para definir su función. Alternativamente, puede crear una función y usarla en Func.

+0

Muchas gracias – IExtensible

1

Pruebe algo como esto. Al utilizar este código, crea una función anónima que solo tiene que tocar el registro una vez, lo que aumenta la eficacia general. También es más fácil de leer si está familiarizado con la invocación e invocación de lambda. Resumiendo esta lambda en una función general int-to-Enum sería óptimo.

.WithFun(rec => ((Func<BloodGroup, int>) 
    (i => 
     { 
      if(rec.IsDBNull(i)) return BloodGroup.NotSet; 
      switch(i) 
      { 
       case 1: 
        return BloodGroup.OPositive; 
       case 2: 
        return BloodGroup.ONegative; 
       // More cases... 
       default: 
        return BloodGroup.NotSet; 
      } 
     })).Invoke(rec.GetOrdinal("BloodGroup")))