2010-10-21 15 views
5

Ich verwende Enterprise Library.Ich möchte die Spalte (des Integer-Typs) zu Enum Type zuordnen.C# Lambda Expression Mapping mehrere Bedingungen

Say

Enum BloodGroup Type 
{ 

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

Ich Mapping-Datenbank Tabelle der Spalte auf C# Typen der (Klasse Employee) Eigenschaften.

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(); 

-Code funktioniert gut, aber ich möchte mehrere Zustand von Enum in WithFun Erweiterung zur Karte Method.I bedeutet so etwas wie

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

Helfen Sie mir mehrere Zustand zu überprüfen?

+0

Ist es NHibernate ??? – Aliostad

+0

Nein Enterprise Library 5.0 – IExtensible

Antwort

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

Alles, was Sie hinzufügen müssen, sind einige Doppelpunkte und ein abschließender Else-Ausdruck. Siehe ternary operator.

+0

Ja Es funktioniert gut – IExtensible

1

Verwendung

.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 

Grundsätzlich können Sie geschweifte Klammern verwenden, um Ihre Funktion zu definieren. Alternativ können Sie eine Funktion erstellen und in Func verwenden.

+0

Vielen Dank – IExtensible

1

Versuchen Sie etwas wie das. Mit diesem Code erstellen Sie eine anonyme Funktion, die den Datensatz nur einmal berühren muss, um die Effizienz insgesamt zu erhöhen. Es ist auch einfacher zu lesen, wenn Sie mit Lambda Casting und Aufruf vertraut sind. Dieses Lambda in eine allgemeine Int-zu-Enum-Funktion zu abstrahieren wäre optimal.

.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")))