2013-04-09 3 views
4

Я знаю, что это, вероятно, вопрос новичков. Есть ли способ выбрать разные критерии поиска в зависимости от значения bool? Позже в коде я хочу пропустить объект (alDisabledPrograms). Я знаю, что if/else неверен, я добавил это, чтобы показать, как мне хотелось бы, чтобы это было обработано. Я попытался поместить это в большее условие if/else, но позже не смог выполнить цикл через alDisabledPrograms. Мысли?Linq if/else условие?

var alDisabledPrograms = xlServerRoles.Descendants("ServerRole") 
    if(isDup) 
    { 
     .Where(dp => dp.Element("ServerType").Value == currentColumn.Substring(0, currentColumn.Length - 1)) 
    } 
    else 
    { 
     .Where(dp => dp.Element("ServerType").Value == currentColumn) 
    } 
    .Descendants("ProgramName") 
    .Select(p => p.Value) 
    .ToList(); 

ответ

14

С вашего конкретного кода, ответ очень прост:

string targetColumn = isDup ? currentColumn.Substring(0, currentColumn.Length - 1) 
          : currentColumn; 
var alDisabledPrograms = xlServerRoles.Descendants("ServerRole") 
      .Where(dp => dp.Element("ServerType").Value == targetColumn) 
      .Descendants("ProgramName") 
      .Select(p => p.Value) 
      .ToList(); 

В целом, хотя, применять самые разные запросы, вы можете либо использовать:

IEnumerable<XElement> roles = xlServerRoles.Descendants("ServerRole"); 
if (isDup) 
{ 
    roles = roles.Where(dp => ...); 
} 
else 
{ 
    roles = roles.Where(dp => ...); 
} 
var alDisabledPrograms = roles.Descendants(...) 
           ... 

Или вы могли бы использовать условный оператор для построения правильного предиката:

var filter = isDup ? (Func<XElement, bool>)(dp => ...) 
        : (Func<XElement, bool>)(dp => ...); 
var alDisabledPrograms = xlServerRoles.Descendants("ServerRole") 
     .Where(filter) 
     .Descendants("ProgramName") 
     .Select(p => p.Value) 
     .ToList(); 
1

Переведите тест isDup в выражение Where. Используйте встроенную анонимную функцию вместо выражения отдельной строки, чтобы вы могли использовать нормальный оператор if/else.

Как это:

var alDisabledPrograms = xlServerRoles.Descendants("ServerRole") 
     .Where(dp => { 
      if (isDup) 
      { 
      return dp.Element("ServerType").Value == currentColumn.Substring(0, currentColumn.Length - 1)) 
      } 
      else 
      { 
       return dp.Element("ServerType").Value == currentColumn) 
      }) 
    .Descendants("ProgramName") 
    .Select(p => p.Value) 
    .ToList(); 
2

Вставьте isDup в ИНЕКЕ:

var alDisabledPrograms = xlServerRoles.Descendants("ServerRole") 
    .Where(dp => isDup ? 
     (dp.Element("ServerType").Value == currentColumn.Substring(0, currentColumn.Length - 1)) : 
     (dp.Element("ServerType").Value == currentColumn)) 
    .Descendants("ProgramName") 
    .Select(p => p.Value) 
    .ToList(); 

Я думаю, что это будет делать.

0

Просто сделайте это один раз перед началом цикла:

string serverType = currentColumn; 
if(isDup) 
    serverType = currentColumn.Substring(0, currentColumn.Length - 1); 

var alDisabledPrograms = xlServerRoles.Descendants("ServerRole") 
    .Where(dp => dp.Element("ServerType").Value == serverType) 
    .Descendants("ProgramName") 
    .Select(p => p.Value) 
    .ToList(); 
1

Вы можете построить запрос, как это:

var query = xlServerRoles.Descendants("ServerRole"); 

if(isDup) 
{ 
    query = query.Where(dp => dp.Element("ServerType").Value == currentColumn.Substring(0, currentColumn.Length - 1)) 
} 
else 
{ 
    query = query.Where(dp => dp.Element("ServerType").Value == currentColumn) 
} 

var alDisabledPrograms = query.Descendants("ProgramName").Select(p => p.Value).ToList(); 
0

месте вы isDup внутри Где

.Where(dp => dp.Element("ServerType").Value == (isDup ? currentColumn.Substring(0, currentColumn.Length - 1) 
                : currentColumn)) 
Смежные вопросы