0

このロジックを反映するために三項演算子を使用することは可能ですか?

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

HolidayAuthStatusPending3 つの値 ( (1)、Authorised(2)、Rejected(3))を持つ列挙型です。の値を割り当てるときに、これをコードに反映したいと思いますAuthorisationStatus

4

2 に答える 2

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)

編集:

@Jamesが言ったように、メソッドはLinq-to-entitiesではなくLinq-to-objectでのみ機能します

于 2013-11-14T12:15:37.550 に答える
4

はい、可能です。三項演算子で演算子の優先順位を正しく設定するのは難しいと思うので、括弧を使用することをお勧めします。

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

これは列挙型へのマッピングであるため、@wodzik が示唆するようにキャストを使用することもできます。データベースにあるものと同じ値を列挙型の値に使用することが可能で実行可能である場合です。

それを使用するには、明示的に列挙型に値を割り当てる必要があります

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

次に、次のことができます。

AuthorizeStatus = (HolidayStatus)x.InternalHolidayStatus
于 2013-11-14T12:15:38.110 に答える