Динамический Linq «OrderBy» для значений времени выполнения

1

Я смотрел на Dynamic Linq сегодня (установлен в VS через NuGet)... но все примеры, которые я нашел до сих пор, предполагают, что OrderBy должен выполняться по известному имени свойства или столбца; однако я пытаюсь OrderBy поле, которое не сильно типизировано; но фактически ключевое значение объекта строки, которое получено из Словаря; например

class RowValues : Dictionary<string, string>
{
...
}

Таким образом, список, который нужно заказать, представляет собой, в частности, список объектов RowValues, заполненных парами Name, Value. Для данного списка RowValues поле OrderBy может быть любым из ключей записей с именованными парами значений (fyi: я хочу, чтобы поле orderby было задано в файле конфигурации xml в конечном итоге, чтобы упорядочить можно было изменить без повторного развертывания двоичных файлов и т.д).

У меня есть догадка, что решение заключается в написании пользовательской функции заказа, переданной в OrderBy??? Эта функция, очевидно, знает, как получить конкретное значение из объекта RowValues, учитывая имя поля из xml config....?? Ответы, которые я видел до сих пор, показывают передачу строки, которая содержит заказную позицию order by в OrderBy, которая близка к тому, где я хочу быть, но как в моем случае среда выполнения знает, где найти поля, упомянутые в Строка OrderBy??

Вход будет очень оценен, или я полностью неправильно понял функции Dynamic Linq?

Теги:
linq
dynamic

2 ответа

0

Если вы используете динамический LINQ, это будет просто:

var sortColumn = GetConfigValue(...);
var sorted = RowValues.OrderBy(sortColumn);

Конечно, вы можете использовать конкатенированную строку для создания множественного сортировки ("column1, column2 DESC"). Насколько мне известно, нет специальной функции сортировки, если вы не используете обычный LINQ.

Кроме того, я хотел бы убедиться, что вы знаете характеристики Dynamic LINQ.


Редактировать:

Это то, что вы ищете? Это будет заказывать его на основе значения записи "Ключ" в словаре. Если вам нужно несколько сортировок, вы можете использовать его в цикле с .ThenBy()

void Main()
{
    List<RowValues> v = new List<RowValues>();
    var key = "Key"; //GetFromConfig();

    var v1 = new RowValues();
    v1.Add("Key", "1");
    v1.Add("3", "5");

    var v2 = new RowValues();
    v2.Add("Key", "3");
    v2.Add("2", "2");

    var v3 = new RowValues();
    v3.Add("Key", "2");
    v3.Add("2", "2");

    v.Add(v1);
    v.Add(v2);
    v.Add(v3);

    v.OrderBy(r => r[key]).Dump();
}

class RowValues : Dictionary<string, string>
{

}
  • 0
    Благодарю вас за ответ Кайла :-) однако моя интерпретация вашего кода в моем решении привела к исключениям, так как среда выполнения не смогла найти свойство в строке, которое соответствует указанному имени столбца сортировки. Это потому, что сами строки являются просто производными объектами Dictionary <string, string>. Это возвращает меня к моей первоначальной проблеме применения динамического синтаксиса linq к строкам пар ключ-значение вместо конкретных имен свойств, которые отображаются на «столбцы». Я не думаю, что мое объяснение проблемы является хорошим, и я нашел решение, которое я напишу и опубликую как можно скорее.
  • 0
    @Toadfather, дайте мне знать, если вы ищете второй код. Я не думаю, что ваши объяснения также хороши;), но я думаю, что мы можем добраться до основной проблемы.
Показать ещё 3 комментария
-1

Кайл, еще раз спасибо. Извинения за поздний ответ, я перешел от этой проблемы сейчас, но из интереса и вежливости я хотел вернуться и согласиться, что ваш код намного ближе к тому, куда я хотел добраться, но мы потеряли динамический аспект linq. Итак, когда вы вызываете OrderBy и заказываете ключ, я бы хотел передать строку, содержащую команду порядка, например "r [key] desc". Причина в том, что я хотел бы оставить определение о том, в каком направлении приказывать до времени исполнения. Я подозреваю, что они будут выполнены с использованием дерева выражений, возможно? например: здесь

  • 1
    Пожалуйста, не добавляйте «спасибо» в качестве ответа. Как только вы наберете достаточную репутацию , вы сможете голосовать за вопросы и ответы , которые показались вам полезными.
  • 0
    Хорошо, это то, что случилось. Я хотел добавить «спасибо» в качестве комментария, но я не мог понять, как получить форматирование разметки кода в комментарии (так как мой ответ включал одну строку кода, которую я хотел показать красиво отформатированным), поэтому я создал ответ. Я вижу в справочном руководстве, что это не рекомендуемая практика, хорошо, но как мне ответить на ответ и включить форматирование кода?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню