Измените порядок по полю на основе условия

#c# #linq #linq-to-sql #lambda

#c# #linq #linq-to-sql #лямбда

Вопрос:

У меня есть сценарий, в котором я должен изменить порядок по полю на основе некоторого условия.

 from summaryRows in _summaryTable.AsEnumerable()
where summaryRows.Field<string>("AirlineDisplayName")
                 .Equals(airlineName_, StringComparison.OrdinalIgnoreCase) 
orderby summaryRows.Field<decimal>("FareAdult")
select new
{
    summaryTableRow = summaryRows
};
  

На основе условия я должен изменить порядок по полю на orderby summaryRows.Field<double>("BasePricePlusTaxAndFees")
Здесь оба типа данных поля отличаются. Как я могу сделать это в одном запросе?

Ответ №1:

Я думаю, что это будет наиболее читаемым, используя свободный синтаксис Linq и вводя оператор if при построении запроса.. Поскольку вы не объясняете свое условие, я предполагаю, что у вас есть логическая переменная с именем condition с соответствующим значением:

 var query = _summaryTable.AsEnumerable()
     .Where(
         summaryRows => summaryRows.Field<string>("AirlineDisplayName")
             .Equals(airlineName_, StringComparison.OrdinalIgnoreCase));

if (condition)
    query = query.OrderBy(summaryRows => summaryRows.Field<decimal>("FareAdult"));
else
    query = query.OrderBy(summaryRows => summaryRows.Field<double>("BasePricePlusTaxAndFees"));

var resultQuery = query.Select(summaryRows => new
    {
        summaryTableRow = summaryRows
    });
  

Отказ от ответственности: я не тестировал это, но удачи.

Комментарии:

1. Однако есть одна проблема: вам, вероятно, потребуется объявить отдельную переменную для проекции в конце. query имеет перечислимое значение DataRow вплоть до сортировки. Проекция изменяет тип на перечислимый анонимный тип.

Ответ №2:

Как насчет этого:

 orderby conditionIsTrue ? (IComparable)summaryRows.Field<double>("BasePricePlusTaxAndFees") : (IComparable)summaryRows.Field<decimal>("FareAdult")