#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")