Динамическая генерация предложения Linq / Lambda Where - PullRequest
2 голосов
/ 10 мая 2011

Я искал здесь и в Google, но я в растерянности.Мне нужно, чтобы пользователи могли искать в базе данных отчеты, используя форму.Если у поля в форме есть значение, приложение получит любые отчеты с этим полем, установленным на это значение.Если поле формы остается пустым, приложение игнорирует его.Как я могу это сделать?В идеале я хотел бы просто написать предложения Where в виде строк и сложить те, которые не являются пустыми.

.Where("Id=1")

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

Другой подход заключается в извлечении всех отчетов и их фильтрации в предложении where ввремя.Я не решаюсь сделать это, потому что: 1. это огромный кусок данных по сети и 2. это большая обработка на стороне пользователя.Я хотел бы воспользоваться возможностями обработки сервера.Я слышал, что он не будет запрашивать, пока не будет запрошен.Таким образом, выполнение чего-то подобного

    var qry = ctx.Reports
          .Select(r => r);

фактически не запускает запрос, пока я не выполню:

    qry.First()

Но если я начну делать:

    qry = qry.Where(r => r.Id = 1).Select(r => r);
    qry = qry.Where(r => r.reportDate = '2010/02/02').Select(r => r);

Будет ли этозапустить запрос?Так как я добавляю к нему предложение where.Мне бы хотелось простое решение ... в худшем случае я бы использовал вещи из Query Builder ... но я бы предпочел избежать этого (кажется сложным).

Любой совет?:)

Ответы [ 3 ]

2 голосов
/ 10 мая 2011

Linq задерживает выборку записи до тех пор, пока запись не будет выбрана. Это означает, что составление предложений Where только добавляет предложения AND / OR к запросу, но все еще не выполняет.

Выполнение сгенерированного запроса будет выполнено в тот момент, когда вы попытаетесь получить запись (First, Any и т. Д.), Список записей (ToList ()) или перечислить их (foreach).

.Take (N) не считается извлечением записей, но добавление (SELECT TOP N / LIMIT N) к запросу

1 голос
/ 10 мая 2011

Нет, это не будет запускать запрос, вы можете структурировать свой запрос таким образом, и на самом деле это предпочтительнее, если это помогает удобочитаемости.В этом случае вы пользуетесь ленивым вычислением.

Запрос будет выполняться только в том случае, если вы перечислите результаты с его помощью, например, foreach, или вы принудительно оцените результаты запроса, например, с помощью .ToList() илив противном случае форсируйте оценку, то есть оценивайте один результат, используя, например, First() или Single().

1 голос
/ 10 мая 2011

Попробуйте проверить эту динамическую версию Linq dll , выпущенную несколько лет назад - она ​​все еще прекрасно работает и выглядит как раз то, что вы ищете.

...