C #, Linq2SQL: создание выражений - PullRequest
3 голосов
/ 26 марта 2009

Как ты это делаешь?

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

Начните с сбора чего-либо из контекста данных, а затем начните фильтровать по целому ряду различных критериев. Если это, то те или, возможно, те, если не это, не то, а то, и то, и то, и другое, и за холмом, если не что иное, тогда назад, вверх и дальше.

Ладно, может быть, не так уж сложно ... но мне нужно построить деревья, подобные этим:

        start
          |
          x
          |
          x
         / \
        x   x
        |   |
        x   x
         \ /
          x
         / \
        x   x
        |   |
        x   |
        |   |
        x   x
         \ /
          x
          |
        result

Где | представляет And, а ветви представляют Or. Из-за Or альтернативных путей я не могу использовать data.Where(...).Where(...).Where(...) до конца. И использование таких вещей, как Union и Concat, имеет тенденцию к краху (на самом деле пока не удалось использовать его в рабочем состоянии). Другими словами, мне нужно создать Expression<Func<T, bool>> экземпляров.

Я создал методы расширения для добавления их вместе с AndAlso и OrElse большой помощью из Marc . Я начал создавать класс построителя предикатов для сделать вещи еще немного проще. План состоит в том, чтобы создать цепочки And -материалов, а затем Or их вместе ... вроде ...: p

В любом случае, я просто не могу решить, хорошие это идеи или нет. Я думаю, что путь, по которому я сейчас пошел, вероятно, может закончиться хорошей «рабочей средой» для меня, когда я буду кодировать эти цепочки. Но мне любопытно узнать, как другие решают эти проблемы. Что, я думаю, может быть довольно распространенным явлением, по крайней мере, в приложениях, которые должны фильтровать и обрабатывать данные всевозможными странными способами, а затем отображать их пользователю.

Ответы [ 2 ]

2 голосов
/ 26 марта 2009

Некоторые люди клянутся Предикатом Строителя . Лично мне всегда было достаточно манипулировать Expression вручную - но, может быть, я просто странный (и, кроме того, я уже давно играю с Expression API). Но пока у вас есть подходящие модульные тесты, я не вижу проблем с этим подходом. Самым большим недостатком будет ограниченная поддержка EF для Expression.Invoke - будьте уверены, это будет одна из первых вещей, которые я проверю, когда 4.0 выйдет «бета».

1 голос
/ 26 марта 2009

Это не особо понятно, и, возможно, станет еще уродливее, если это будет очень сложная ситуация, но для простых вещей я иногда создаю запросы, подобные этому

string MinOrMaxOption = "min";
int CompareValue = 5;
var Results = from row in MyData
              where (MinOrMaxOption=="min" && row.ValueA > CompareValue)
              || (MinOrMaxOption=="max" && row.ValueA < CompareValue)
              select row;

Это, конечно, работает, только если возможности запроса предопределены. Я не знаю, так ли это в вашем примере или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...