2013-11-14 3 views
0

Можно ли использовать трёхмерный оператор , чтобы отразить эту логику?C# Тернарный оператор, используемый в запросе LINQ

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

Я делаю следующее в LINQ Query:

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.

+0

Очевидно, что вы используете его уже так в чем проблема? Также, если 'HolidayAuthStatus' соответствует' AuthorisationStatus', вы можете просто сделать прямой бросок. – James

+0

Это LINQ-to-Objects, LINQ-to-SQL или LINQ-to-Entities? –

ответ

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) 

EDIT:

как сказал @James метод будет работать только в Linq-to-object не в Linq-to-entity

+2

Метод подхода, скорее всего, будет работать только с LINQ To Objects. – James

+0

@James хорошая точка Я не видел 'DAL()' в использовании, я напишу это в своем ответе, спасибо – wudzik

+0

@wudzik спасибо, это аккуратный способ, но он не работает в запросе LINQ. Эта ошибка была возвращена: LINQ to Entities не распознает метод 'Timeshet.Web.Models.Enum.HolidayAuthStatus GetStatus (Int32)', и этот метод не может быть переведен в выражение хранилища –

4

Да, это возможно. Я думаю, что это трудно, чтобы получить право оператора очередности с тройным оператором, поэтому я предпочитаю использовать круглые скобки:

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 
+0

Это не похоже на очень читаемое использование тернарного оператора ... –

+1

У вас есть лучшее предложение для форматирования? К сожалению, в C# нет оператора switch-case, только операторы, которые не могут использоваться в запросах LINQ. –

+0

Я бы не гнездовал тройных операторов. –

Смежные вопросы