C#Lambda表达式映射多个条件

时间:2010-10-21 20:28:09

标签: c# lambda

我正在使用Enterprise Library。我想将列(整数类型)映射到Enum Type。

Enum BloodGroup Type
{

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

我将Database Table的列映射到C#Types(Class Employee)属性。

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

代码工作正常,但我想在WithFun扩展方法中映射枚举的多个条件。我的意思是

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

帮我核对多种情况?

3 个答案:

答案 0 :(得分:2)

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

您需要添加的是一些冒号和最后的其他表达式。请参阅ternary operator

答案 1 :(得分:1)

使用

 .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

基本上你可以使用花括号来定义你的功能。或者,您可以创建一个函数并在Func中使用它。

答案 2 :(得分:1)

尝试这样的事情。使用此代码,您可以创建一个匿名函数,只需触摸一次记录,从而提高全面效率。如果您熟悉lambda强制转换和调用,它也更容易阅读。将此lambda抽象为一般的int-to-Enum函数将是最佳的。

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