Динамическое выражение в linq - PullRequest
       12

Динамическое выражение в linq

1 голос
/ 21 сентября 2011

Я пытаюсь создать библиотеку, в которой я могу указать параметры запроса и операторы в XML-файле, а во время выполнения я могу генерировать выражения linq на основе XML-файла. У меня это работает только на построение выражений "где", поэтому такие простые запросы, как select * from table, где table.id = 1. Вот пример простого запроса в файле xml:

<query name="latest">
    <PropertyValue PropertyName="TimeStamp" OperatorName="GreaterThanOrEqual" ParamName="lastUpdated" />
</query>

Имя свойства TimeStamp - это имя свойства в классе C # для использования. ParamName - это параметр URL, поступающий из http-запроса в моем приложении asp.net. В коде я могу построить выражение linq из этого и сделать следующее предложение where:

(IQueryable<DataObject>)dataObjects.Where(expression);

где выражение:

TimeStamp >= "2011-09-21T11:54:24"

Но у меня есть новый тип запроса, который мне нужно обрабатывать:

выберите * из таблицы t, где Id = (выберите топ 1 Id из таблицы где Source = t. Порядок источников по Id desc)

Этот запрос выполняется к таблице с полем Id и полем Source. Запрос возвращает самую новую запись для каждого источника. Таким образом, он группируется по источнику и упорядочивает его в порядке убывания и возвращает первую запись для каждого источника. Затем внешний выбор возвращает все столбцы для каждого из результатов внутреннего выбора. Пример:
Таблица:

id   source     field3  field4
1    Device1    test    test
2    Device2    test2   test2
3    Device1    test3   test3
4    Device2    test4   test4

Результаты запроса:

id   source     field3  field4
3    Device1    test3   test3
4    Device2    test4   test4

Так что теперь мне нужно динамически сгенерировать вложенный запрос в предложении where. Наверное, мой первый вопрос: можно ли преобразовать этот строковый запрос в запрос linq? Тогда мне нужно как-то динамически построить этот вложенный запрос .. Извините, если он не имеет большого смысла ...

1 Ответ

0 голосов
/ 22 сентября 2011

Может быть, PredicateBuilder это то, что вы ищете?

...