在LINQ查询中使用的C#Ternary运算符

时间:2013-11-14 12:12:10

标签: c# linq

是否可以使用三元运算符来反映此逻辑?

if (a = 1)
{
    somevalue = "hello";
} 
else if (a = 2)
{
    someValue = "world";
}
else if (a = 3)
{
    someValue = "hellWorld";
}

我在LINQ查询中执行以下操作:

using (var data = new DAL())
{
    var result = data.Holidays.AsNoTracking()
                 .Where(x => x.RequesterId == userId)
                 .Select(x => new HolidayModel
                 {
                     HolidayId = x.HolidayId,
                     FromDate = x.FromDate,
                     ToDate = x.ToDate,
                     AuthorisationStatus = x.InternalHolidayStatus == 1 ?
                         HolidayAuthStatus.Pending :
                         HolidayAuthStatus.Rejected,
                     DateModified = x.ModifiedDate
                 }).ToList();

    return Json(result.ToDataSourceResult(request));
}

HolidayAuthStatus是一个枚举,其中包含三个值(Pending(1),Authorised(2)和Rejected(3));我想在分配AuthorisationStatus

的值时在代码中反映这一点

2 个答案:

答案 0 :(得分:4)

更改为

AuthorisationStatus = (HolidayAuthStatus)x.InternalHolidayStatus

如果HolidayAuthStatus的整数值与InternalHolidayStatus值匹配,它将起作用。这里的三元运营商看起来很可怕。如果您的状态代码不匹配,最好让函数接受int status并返回HolidayAuthStatus

HolidayAuthStatus GetStatus(int status)
{
    if(status == 1) return HolidayAuthStatus.Pending;
    if(status == 2) return HolidayAuthStatus.Authorised;
    if(status == 3) return HolidayAuthStatus.Rejected;
    return HolidayAuthStatus.Unknown; // for e.g.
}

并使用它:

AuthorisationStatus = GetStatus(x.InternalHolidayStatus)

编辑:

as @James说方法只适用于Linq-to-object而不是Linq-to-entities

答案 1 :(得分:4)

是的,这是可能的。我认为使用三元运算符很难得到运算符优先级,所以我更喜欢使用parantheses:

AuthorizationStatus = x.InternalHolidayStatus == 1 ?
    HolidayStatus.Pending :
    (x.InternalHolidayStatus == 2 ?
        HolidayStatus.Rejected : 
        (x.InternalHolidayStatus == 3 ?
            HolidayStatus.Authorized : 
            HolidayStatus.Invalid))

由于这是枚举的映射,因此如果对于枚举值使用与数据库中相同的值是可行且可行的话,也可以使用@wodzik建议使用强制转换。

要使用它,您必须将explictility分配给枚举值

public enum HolidayStatus
{
    Pending = 1,
    Rejected = 2,
    Authorized = 3
}

然后你可以这样做:

AuthorizeStatus = (HolidayStatus)x.InternalHolidayStatus