LINQ и динамические запросы с подкачкой и без LINQ2SQL

StackOverflow https://stackoverflow.com/questions/1800547

  •  05-07-2019
  •  | 
  •  

Вопрос

Я попробовал несколько способов использовать динамические запросы LINQ - LINQKit и Библиотека динамических запросов LINQ. Мне не нравится второе, потому что оно каким-то образом убивает идею LINQ - возможность проверять запросы во время компиляции. И с LINQKit я не нашел хороший пример для моего сценария. Также я не люблю чрезмерное использование отражения.

Мой сценарий следующий. У меня есть веб-сервис, который занимается бизнес-логикой и логикой DAL. Приложение webforms отделено. У меня есть страница с галочками для каждого поля, которое пользователь хотел бы отфильтровать, а также текстовое поле для ввода каждого значения фильтра. В моем веб-сервисе есть метод GetByFilter, в котором я передаю список. QueryObject - это класс со строкой: filedName, object: fieldValue.

Тогда мой веб-сервис получил список объектов запроса, и теперь возникает большой вопрос: как перевести его в запрос LINQ, если число полей и значения фильтров могут различаться?

Что еще хуже - я не использую LINQ2SQL, но я использую несколько пользовательских DAL с репозиториями, которые могут возвращать IQuery при необходимости (например, так: http://msdn.microsoft.com/en-us/magazine/dd569757. ASPX выделите хранилище).

Я знаю, что могу использовать пейджинг с LINQ2SQL: var PagedData = query.Skip ((iPageNum - 1) * iPageSize) .Take (iPageSize);

Так как же тогда я могу получить параметры динамического запроса (и iPageNum и iPageSize) из LINQ в мою базовую реализацию DAL, чтобы выполнить эти запросы специфичным для поставщика данных способом? Может быть, я должен реализовать свой DAL как некоторый поставщик данных LINQ (я понятия не имею, как это сделать)?

Проблема в том, что я не хочу зависеть от LINQ2SQL (тогда я мог бы просто реализовать свои репозитории в качестве оболочки для LINQ2SQL), но в то же время я хочу, чтобы LINQ запрашивал возможности везде, кроме моего DAL. Возможно ли это?

Это было полезно?

Решение

Конечно, возможно, вам нужно создать собственный IQueryable, " пользовательский поставщик LINQ "

Вот статья MSDN: http://msdn.microsoft.com/ ан-нас / библиотека / bb546158.aspx а у Мэтта Уоррена есть серия блогов: http://blogs.msdn.com/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx

Я рекомендую начать с него, чтобы понять, насколько сложным оно может быть и стоит ли оно того для вас!

Если вы решите против этого, прочитайте это сообщение в блоге: http: // www .hanselman.com / блог / RealWorldAppsInDaysNotWeeks.aspx и посмотрим, будут ли вам полезны ADO.Net Data Services (Astoria)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top